2012-03-05 75 views

回答

4

grep -l只列出文件名。

我用這一切的時候編輯包含一些

vi $(grep -l pattern) # edit all files containing pattern 

請修改您的問題,如果這樣做沒有幫助足夠的文件。

+0

非常感謝您的幫助。 '-l'確實是我需要的操作,但是如果有多個模式,我如何找到文件,而不是包含同時匹配所有模式的行? – user1224398 2012-03-05 22:31:39

+0

偉大的卡茲!這個命令非常有幫助! :) – 2012-03-05 23:26:29

+0

關於通過AND結合的多種模式,您可以執行的操作是遵循上面的想法。獲取與pattern1匹配的文件列表。然後將其提供給另一個grep -l等。我會爲此做出另一個答案。 – Kaz 2012-03-05 23:38:21

0

在我的第一個答案下發表了評論。有多種模式,其任務是獲取匹配所有文件的文件列表。包括GNU的大多數greps都不實現正則表達式& intersection operator。我們可以做的是首先獲得與第一個模式匹配的文件列表。然後將該文件列表提供給另一個grep以針對下一個模式進行測試等等。

一種方法是用命令替換,這是笨拙和休息時有在文件名中的空格:

grep -l pat2 $(grep -l pat1 $(grep -l pat0 *))) 

# $(grep -l pat0 *) gets replaced with the names of files matching pat0 
# then $(grep -l pat1 <list>) is further refined to include only those matching pat1 
# then $(grep -l pat2 <that-list>) is refined once more 

使用xargs的溶液在上述解決方案解決了一些弱點以及摺疊遠離嵌套。我們把每個grep的-l級輸出的文件列表,並將其轉換爲論據,下一階段使用xargs的:

grep -l pat0 * | xargs grep -l pat1 | xargs grep -l pat2 

A「編譯」這個可以寫,例如

# the multigrep shell function takes these arguments and produces a pipeline 
# like above, then evaluates it using eval. 

multigrep pat0 pat1 pat2 * 

當然,如果模式都只是固定的字符串,作爲原始郵件中暗示,-F添加到裏grep。

+0

如果任何階段產生一個空文件列表,我認爲這個東西會中斷,因爲那麼xargs會運行grep,並且會從stdin中獲得材料。可以應用通常的/ dev/null參數hack。當然GNU xargs有--no-run-if-empty。 – Kaz 2012-03-05 23:58:09

+0

非常感謝你! – user1224398 2012-03-06 00:10:25

+0

GNU grep應該有-P(PCRE),它具有您正在尋找的正則表達式功能。 – jordanm 2012-03-07 01:58:02

相關問題