【问题标题】:How do I correctly pass double quotes to an awk subprocess in Python?如何正确地将双引号传递给 Python 中的 awk 子进程?
【发布时间】:2014-12-05 22:40:01
【问题描述】:

我正在尝试运行简单的 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"

但是我显然缺乏如何正确处理双引号的知识。我尝试用几个反溅来逃避它们,但这一切都没有奏效。 如何正确转义双引号以使上面的示例正常工作?

【问题讨论】:

  • 你用的是哪个版本的python?
  • test.txt 是什么样子的?
  • 这里显而易见的事情是不要使用shell=True,也不要尝试构建一个引用引号等的命令行。如果您不使用任何 shell 功能,为什么要让您的生活更加困难(并且您的代码效率更低、安全性更低、更难调试)?
  • 显然是python2,因为print p ;)

标签: python shell awk escaping


【解决方案1】:

当您使用 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,"

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2022-08-03
    • 2015-01-17
    相关资源
    最近更新 更多