7

我目前有

".".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'

有任何想法吗 ?

4

2 回答 2

7

看起来像命令行上的引用问题。

尝试将 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 解释器,因此您需要显式打印结果。

于 2013-04-05T13:33:50.390 回答
7

在引用的 heredoc 中输入您的脚本,而不是使用python -c,这样您就可以完全解决问题;此外,这使您可以在代码中使用换行符,因此它更具可读性。

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"
于 2013-04-05T14:01:43.147 回答