如何安全地将带有大量引号的shell命令转义为Python字符串



我有以下awk命令:

awk FPAT="([^,]+)|("[^"]+")" '{ print  $7048 }' ...

我想使用CCD_ 1提交它,但我找不到正确的方法来用所有特殊字符在python字符串中编写代码。以下是我的最新尝试:

cmd = " awk -v  FPAT="([^,]+)|(\""[^\""]+\"")""  ' {{ print   %s  }} '  %s  > %s" .format(c,input,output)

我得到以下结果:

' awk -v  FPAT="([^,]+)|(\[^\]+\)  ' { print   %s  } '  %s  > %s'

有人能帮帮我吗?

您混淆了%运算符使用的占位符和format方法使用的字段说明符。

cmd = "awk -v  FPAT="([^,]+)|(\""[^\""]+\"")""  ' {{ print   {}  }} '  {}  > {}" .format(c, input, output)

此外,您应该使用subprocess模块而不是os.system。Python可以处理输出重定向,因此不需要shell。

with open(output, "w") as f:
subprocess.run(["awk", "-v", 'FPAT=([^,]+)|("[^\"]+")', '{{ print {} }}'.format(c), input])

假设Python 3.6或更高版本,则可以使用f-string文字来简化awk脚本。

with open(output, "w") as f:
subprocess.run(["awk", "-v", 'FPAT=([^,]+)|("[^\"]+")', f'{{ print {c} }}', input])

您可以使用input()方便地将文本转换为字符串,然后将其复制粘贴到源代码中:

>>> cmd = input()
awk FPAT="([^,]+)|("[^"]+")" '{ print  $7048 }' ...
>>> cmd
' awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print  $7048 }' ...'

在Python 2中,请改用raw_input()

顺便说一句,避免使用input作为变量名,因为它会隐藏内置的os.system(cmd)0,并且会使此方法不起作用。


或者,如果文本不包含任何三引号,则可以使用三引号原始字符串:

>>> cmd = r''' awk FPAT="([^,]+)|("[^"]+")" '{ print  $7048 }' ...'''
>>> cmd
' awk FPAT="([^,]+)|(\"[^\"]+\")" '{ print  $7048 }' ...'

感谢Charles Duffy在评论中建议使用原始字符串选项

最新更新