99
4

10 回答 10

117

只是链接grep怎么样?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
于 2013-08-27T14:49:30.747 回答
24

另一个没有链接的解决方案grep

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

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

于 2013-08-27T15:00:32.537 回答
10

有点老了,不过还好...

@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 想要的行为。

于 2016-07-08T07:59:21.823 回答
9

用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)
于 2013-08-28T03:42:36.340 回答
6

只需使用!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
于 2019-04-15T08:09:37.203 回答
6

-v是“反向匹配”标志,所以管道是一个很好的方法:

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

于 2018-05-09T12:01:57.267 回答
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
于 2013-08-27T15:47:42.337 回答
4

您可以使用grep -P支持的(perl regex)negative lookbehind

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

我添加\b了单词边界。

于 2013-08-27T14:58:41.297 回答
3
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
于 2013-08-27T14:49:48.750 回答
0

问题:搜索“loom”,不包括“gloom”。
回答:

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
于 2017-06-27T13:59:49.197 回答