如何在Python中正确地将双引号传递给awk子进程?
我试图运行简单的awkshell命令并捕获其输出(使用python2)。 以下是我尝试做的:如何在Python中正确地将双引号传递给awk子进程?,python,shell,awk,escaping,Python,Shell,Awk,Escaping,我试图运行简单的awkshell命令并捕获其输出(使用python2)。 以下是我尝试做的: import subprocess as sb shell = ["awk '!/<tag>/ {print \"\\"\"$1\"\\"\", \"\\"\"$2\"\\"\"}' test.txt"] p = sb.check_output(shell, shell=True) print p 我希望使用awk获得以下输出并将其存储到变量中: "a" "b" "a" "c" "d"
import subprocess as sb
shell = ["awk '!/<tag>/ {print \"\\"\"$1\"\\"\", \"\\"\"$2\"\\"\"}' test.txt"]
p = sb.check_output(shell, shell=True)
print p
我希望使用awk获得以下输出并将其存储到变量中:
"a" "b"
"a" "c"
"d" "d"
然而,我显然缺乏正确处理双引号的知识。我试着用几下后挡板逃离他们,但都没用。
如何正确地转义双引号以使上面的示例正常工作?当您使用
shell=True
但传递一个列表时,您要求Python将字符串列表合并在一起,就像它们是单独的参数一样。这意味着它可以在你所做的任何引用的基础上,进行自己的引用,希望壳牌能够正确地扭转局面。这将是一场噩梦。如果要使用shell=True
,只需传递一个字符串即可
但这就引出了一个问题:首先为什么要使用shell=True
。如果不使用此选项,您可以只传递一个参数列表,而不必引用任何参数来保护它们不受shell的影响。更容易编写,更容易调试,更高效,更安全地引导。除非你真的需要shell功能,或者你有一个命令行,你努力工作,不想花时间分解成单独的参数,否则永远不要使用shell
实际上,我不确定您要在这里运行什么
awk
命令。如果你在$1
和$2
周围给它双引号,它只会打印一个文本“$1”“$2”
,因为这就是引号对awk的含义。也许你想要这样的东西
awk '!/<tag>/ {print "\""$1"\"", "\""$2"\""}' test.txt
awk'!//{打印“\”“$1”\”、“\”“$2”\”“}”test.txt
在这种情况下:
subprocess.check_output(['awk', r'!/<tag>/ {print "\""$1"\"", "\""$2"\""}',
'test.txt'])
子流程。检查\u输出(['awk',r'!/{print“\”“$1”\”,“\”“$2”\”“}),
'test.txt'])
(注意,我使用了一个原始字符串,这样我就可以按字面意思传递“\”
,而不必反斜杠。)
但是这仍然不能提供您想要的输出,因为
$1
将是a,
,所以“\”“$1”\”“
将是”a,“
您使用的是哪一版本的python?test.txt可能与之类似?这里要做的最明显的事情是不要使用shell=True
,不要尝试构建引用引号的命令行,等等。如果您没有使用任何shell功能,为什么要让您的生活变得更困难(代码效率更低、安全性更低、调试更困难)?显然是python2,因为print p
;)
subprocess.check_output(['awk', r'!/<tag>/ {print "\""$1"\"", "\""$2"\""}',
'test.txt'])