如何grep,排除一些模式?

我想find文件中有一些模式的发生和没有其他模式的行。 例如,我需要find包括loom在内的所有文件/行,除了那些gloom 。 所以,我可以用命令findloom

 grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) 

现在,我想searchloom除了gloom 。 但是,以下两个命令都失败了:

 grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp) 

我应该怎么做才能达到我的目标?

编辑1:我的意思是loomgloom是字符序列(不一定是单词)。 所以,我需要在命令输出中使用bloomberg ,而不需要ungloomy

编辑2:有我的期望的样本。 以下两行都在命令输出中:

我面对通过香的面纱而隐约可见的图标。

Arty在一个阴沉的日子里正在变冷

以下两行不在命令输出中:

这是阴郁的,可怕的 – 伟大的污泥。

在pyntit大厅的西南面

如何链接greps?

 grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom' 

另一个解决scheme是不使用链接grep

 egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp) 

在括号之间,除非loom是该线的第一个字符,否则在任何loom出现之前排除字符g

有点老,但是哦…

@houbysoft提供的最新解决scheme将不起作用,因为它将排除任何带有“忧郁”的行,即使它有“织机”。 根据OP的期望,即使他们也有“忧郁”,我们需要包含“织机”的线条。 这条线需要在输出“Arty是在一个阴沉的一天,正在冷清”,但是这将被链接grep像排除

 grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom' 

相反, Bentoy13的egrep正则expression式更好

 egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp) 

因为它会包括任何带有“织机”的行,不pipe它是否有“忧郁”。 另一方面,如果只有黯淡,就不会包含它,这正是OP想要的行为。

只要使用awk,就可以让你清楚地expression复合条件,这比grep简单得多。

如果你想跳过包含loomgloom线条:

 awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp) 

或者如果你想打印他们:

 awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp) 

如果现实是你想要loom作为一个单词本身出现的线:

 awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp) 

/ *你可能看起来像这样?

 grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)` 

BACKQUOTES与括号一样用于命令,因此在这种情况下启用-l ,BACKQUOTES中的代码将返回文件名,然后使用-vn来执行您想要的操作:包含文件名,亚麻布以及实际行。

更新或与xargs

 grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom" 

希望有所帮助。* /

请忽略我上面写的,这是垃圾。

 grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom" #this part gets the filenames with "loom" #this part gets the lines with "loom" #this part gets the linenumber, #filename and actual line 

你可以使用grep -P (perl正则expression式)支持negative lookbehind

 grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp) 

我添加了\b的单词边界。

 grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom' 

问题:search除了“忧郁”之外的“织机”。
回答:

 grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)