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"