如何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:我的意思是loom
和gloom
是字符序列(不一定是单词)。 所以,我需要在命令输出中使用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简单得多。
如果你想跳过包含loom
和gloom
线条:
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)