【问题标题】:Slashes in grep search string called from Python从 Python 调用的 grep 搜索字符串中的斜杠
【发布时间】:2018-03-21 14:39:23
【问题描述】:

我有以下输入文件“testFile.txt”:

$ cat testFile.txt
111     // mNx
222     // mNy not nMx
333     // mNz also not nMx

我想获取 mNx 的值,但是其他一些行包含关于 mNx 的 cmets。在 Unix 命令行上使用 grep 来查找正确的行:

$ grep mNx testFile.txt
111     // mNx
222     // mNy not mNx
333     // mNz also not mNx

然而,

$ grep "// mNx" testFile.txt
111     // mNx

好的,到目前为止一切顺利,但我想使用 Python 调用 grep。继this post之后我有

from subprocess import Popen, PIPE
def grep1(inFile, string):
    COMMAND = 'grep %s %s' % (string, inFile)
    process = Popen(COMMAND, shell=True, stderr=PIPE, stdout=PIPE)
    output, errors = process.communicate()
    return output

mNx = grep1('testFile.txt', 'mNx')
print mNx

给了

111     // mNx
222     // mNy not mNx
333     // mNz also not mNx

现在如果我改用

mNx = grep1('testFile.txt', '// mNx')

它返回以下内容:

testFile.txt:111     // mNx
testFile.txt:222     // mNy not mNx
testFile.txt:333     // mNz also not mNx

我尝试过"\/\/ mNx"r"// mNx"r"\/\/ mNx" 等,但无法重现原生的grep 行为。在我的 Python 字符串中是否有一些东西被转义了?到底是怎么回事?

【问题讨论】:

  • @Inian 感谢您的建议,但这不起作用。
  • 您需要的确切值是多少,您需要数字还是整个匹配行?
  • 我最终会拆分字符串,但这个问题只要求正确的行:)
  • @Inian 在这种情况下我会做mNx = int(grep1("testFile.txt", r'"// mNx"').split()[0])

标签: python bash python-2.7 grep popen


【解决方案1】:

将函数调用改为mNx = grep1('testFile.txt', '"// mNx"')

问题是,我们需要 COMMAND 是这个 Python 字符串文字 'grep "// mNx" testFile.txt'

只有\ 才需要转义。 / 可以在 Python 中按原样表示。

【讨论】:

  • 知道为什么我们需要它会很有趣。
  • 如此简单的解决方案并解决了预期的问题,谢谢。你是对的,如果没有这些外部引号,那么 COMMAND 将是 'grep // mNx testFile.txt'
  • 使用原始 COMMAND 行,grep 在两个文件中搜索字符串“//”,“mNx”(不存在)和“testFile.txt”(存在)。因此,输出包括所有匹配行上的文件名,以指示在哪个文件中找到它。@Nishant
猜你喜欢
  • 2023-03-11
  • 2016-01-17
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2016-08-30
  • 2012-06-29
相关资源
最近更新 更多