Python -c переключатель

У меня сейчас

".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?!$)', r'\1.', "00112233")).split('.')])
'xx.xx.xx.xx'

который работает, но когда я пытаюсь использовать его через переключатель Python -C, это не удается?

[root@monty ~]# python -c "import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?!$)', r'\1.', "00112233")).split('.')])"
python -c "import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?"import re ; ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r'(.{2})(?python)', r'\1.', "00112233")).split('.')])")', r'\1.', "00112233")).split('.')])"
-bash: syntax error near unexpected token `str'

Есть идеи?

2 ответа

Похоже на проблему с цитированием в командной строке.

Попробуйте вместо этого заключить строку Python в одинарные кавычки и не использовать внутри нее одинарные кавычки.

Вы также можете избежать кавычек, которые сталкиваются с интерпретацией оболочки, используя \",

$ python -c 'import re;print ".".join(str(z) for z in [int(x, 16) for x in (re.sub(r"(.{2})(?!$)", r"\1.", "00112233")).split(".")])'
0.17.34.51

Примечание: поскольку вы больше не используете интерпретатор Python, вам необходимо явно распечатать результаты.

Введите ваш сценарий в кавычки heredoc вместо использования python -cИ вы делаете проблему MÕÕT в полном объеме; Кроме того, это позволяет вам использовать новые строки в вашем коде, так что он может быть намного более читабельным.

python - <<'EOF'
import re
print ".".join(str(z) for z in [int(x, 16)
                                for x in (re.sub(r'(.{2})(?!$)',
                                          r'\1.',
                                          "00112233")).split('.')])
EOF

Обратите внимание, что важно, чтобы вы использовали <<'EOF' скорее, чем <<EOF Вот; первый не позволяет оболочке пытаться расширить содержимое heredoc.


Если вы действительно хотите использовать python -cэтот подход все еще может извлечь выгоду из heredoc, используемого для записи сценария в переменную:

python_script=$(cat <<'EOF'
import re
print ".".join(str(z) for z in [int(x, 16)
                                for x in (re.sub(r'(.{2})(?!$)',
                                          r'\1.',
                                          "00112233")).split('.')])
EOF
)

python -c "$python_script"
Другие вопросы по тегам