2017-10-10 89 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