10 回答
只是链接grep怎么样?
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
另一个没有链接的解决方案grep
:
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
在括号之间,您排除g
任何出现之前的字符loom
,除非loom
是该行的第一个字符。
有点老了,不过还好...
@houbysoft 投票最多的解决方案将不起作用,因为它会排除任何带有“gloom”的行,即使它有“loom”。根据 OP 的预期,我们需要包含带有“loom”的行,即使它们也有“gloom”。此行需要在输出“Arty is slooming in a glomy day.”中,但这将被链式 grep 排除在外
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
相反,Bentoy13的egrep 正则表达式示例效果更好
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
因为它将包含任何带有“loom”的行,无论它是否有“gloom”。另一方面,如果它只有阴暗,它不会包含它,这正是 OP 想要的行为。
用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)
只需使用!grep -v
多次。
文件内容
[root@server]# cat file
1
2
3
4
5
排除行或匹配
[root@server]# cat file |grep -v 3
1
2
4
5
排除该行或匹配多个
[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4
-v
是“反向匹配”标志,所以管道是一个很好的方法:
grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
/*你可能看起来像这样?
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 regex)negative lookbehind
:
grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)
我添加\b
了单词边界。
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
问题:搜索“loom”,不包括“gloom”。
回答:
grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)