2017-10-10 51 views
1

叫我有以下的输入文件“TESTFILE.TXT”:斜线在grep的搜索字符串在Python

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

我想MNX的值,但其他一些线路的含有约MNX意见。 Unix命令行中使用grep找到正确的路线:

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

然而,

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

OK,到目前为止好,但我想用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字符串中有什么东西被转义了?到底是怎么回事?

+0

@印度感谢您的建议,但这是行不通的。 – feedMe

+0

你需要什么确切的价值,你需要的数字或整个匹配线? – Inian

+0

我将最终拆分字符串,但这个问题只是要求正确的线:) – feedMe

回答

1

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

的事情是,我们所需要的命令被这个Python的字符串文字'grep "// mNx" testFile.txt'

你需要逃避,只有当它是\/可以用Python表示。

+0

然而,知道为什么我们需要这种方式会很有趣。 – Nishant

+0

这样一个简单的解决方案,并解决了预期的问题,谢谢。你是对的,没有这些外部引号,那么COMMAND就会是''grep // mNx testFile.txt''。 – feedMe

+2

使用原始命令行,grep在两个文件“mNx”(不存在)和“testFile.txt”(存在)中搜索字符串“//”。因此,输出包括所有匹配行上的文件名,以指示找到哪个文件。@Nishant – feedMe