gpt4 book ai didi

python - 如何在 Python 中正确地将双引号传递给 awk 子进程?

转载 作者:行者123 更新时间:2023-12-01 04:56:12 25 4
gpt4 key购买 nike

我正在尝试运行简单的 awk shell 命令并捕获其输出(使用 python2)。这是我尝试做的事情:

import subprocess as sb

shell = ["awk '!/<tag>/ {print \"\\"\"$1\"\\"\", \"\\"\"$2\"\\"\"}' test.txt"]
p = sb.check_output(shell, shell=True)
print p

test.txt内容:

a, b, 5
a, c, 3
d, d, 1

我希望使用 awk 获得以下输出并将其存储到变量中:

"a" "b"
"a" "c"
"d" "d"

但是我显然缺乏如何正确处理双引号的知识。我尝试用几个后挡板逃离它们,但这一切都不起作用。如何正确转义双引号以使上面的示例正常工作?

最佳答案

当您使用 shell=True 但传递一个列表时,您是在要求 Python 将字符串列表合并在一起,就好像它们是单独的参数一样。这意味着它可能会在您所做的任何引用之上进行自己的引用,希望 shell 能够正确地反转事情。这将是一场噩梦。如果您想使用shell=True,只需传递一个字符串即可。

但这提出了一个问题:为什么您首先要使用 shell=True 。如果您不使用它,您可以只传递参数列表,而不必引用其中任何一个来保护它们免受 shell 的影响。更容易编写、更容易调试、更高效、更安全地启动。除非您确实需要 shell 功能,或者您已经有一个经过努力才能工作的命令行并且不想花时间分解为单独的参数,否则永远不要使用 shell。

<小时/>

我实际上不确定您在此处尝试运行什么awk命令。如果你在 $1$2 两边加上双引号,它只会打印一个文字 "$1""$2",因为这就是引号的意思是 awk。也许你想要这样的东西?

awk '!/<tag>/ {print "\""$1"\"", "\""$2"\""}' test.txt

在这种情况下:

subprocess.check_output(['awk', r'!/<tag>/ {print "\""$1"\"", "\""$2"\""}', 
'test.txt'])

(请注意,我使用了原始字符串,因此我可以逐字传递 "\"",而不必使用反斜杠。)

但这仍然无法提供您想要的输出,因为 $1 将是 a,,所以 "\""$1"\"" 将是 "a,"

关于python - 如何在 Python 中正确地将双引号传递给 awk 子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com