2012-03-05 131 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

相关问题