我想在文件中查找出现某种模式且缺少其他模式的行。例如,我需要查找包含loom
的所有文件/行,但gloom
除外。所以,我可以通过命令找到loom
:
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
现在,我想搜索loom
,不包括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在阴沉的日正在蠢蠢欲动。
以下两行都不在命令输出中:
它是阴郁的 ower可怕 - 伟大的mu mu do do o o o o。
在高耸的大厅的西南角
答案 0 :(得分:82)
如何直接链接greps?
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
答案 1 :(得分:17)
没有链接grep
的另一种解决方案:
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
在括号之间,您会在g
出现之前排除字符loom
,除非loom
是该行的第一个字符。
答案 2 :(得分:8)
有点老了,但是很好......
来自@houbysoft的最高投票解决方案将无法正常工作,因为即使它有“织布机”,它也会排除任何带有“忧郁”的行。根据OP的预期,我们需要包含“织布机”的线条,即使它们也有“阴郁”。这条线需要在输出中“Arty在阴沉的日子里蠢蠢欲动。”,但是这将被链接的grep排除在外
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
相反,egrep regex的Bentoy13示例效果更好
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
因为它包含任何带有“织机”的线,无论它是否有“阴郁”。另一方面,如果它只有阴郁,它将不包括它,这正是OP想要的行为。
答案 3 :(得分:7)
只是使用awk,它比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)
答案 4 :(得分:6)
-v
是“倒置匹配”标志,因此管道是一种非常好的方式:
grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
答案 5 :(得分:5)
/ *你可能会看到这样的东西?
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
答案 6 :(得分:4)
您可以使用grep -P
(perl regex)支持negative lookbehind
:
grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)
我为字边界添加了\b
。
答案 7 :(得分:3)
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
答案 8 :(得分:1)
只需使用! char *a = dup_truncated_at("OneExample", 5);
printf("truncated %s\n", a);
free(a); /* remember, the value returned from dup_truncated_at has been obtained with a call to malloc() */
次。
grep -v
[root@server]# cat file
1
2
3
4
5
[root@server]# cat file |grep -v 3
1
2
4
5
答案 9 :(得分:0)
问题:搜索&#39;织机&#39;排除&#39;忧郁&#39;。
回答:
grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)