如何从foo的所有grep结果中过滤foobar?

时间:2015-07-10 03:28:29

标签: regex bash grep

我正在搜索大型代码库中所有出现的公司缩写词,这是一个小的3个字符的单词,如foo。我通常用

来做这件事

grep -Rnoi 'foo' *

从代码库的顶部开始。然而,由于这是一个可以产生大量误报的小词,比如'foobar'或'foocat',我怎么能过滤掉误报呢?

我正在思考...... ...

grep -Rnoi 'foo' * | grep [excludeMagicOption] 'foobar'

显示的结果显示没有'foobar'的所有foo事件。这样做有哪些选择?

3 个答案:

答案 0 :(得分:2)

如果我了解您只想与foo而不是foocat匹配的问题,请使用-w--word-regexp选项仅匹配{foo的整个单词出现次数1}}。例如:

输入文件

$ cat foo.txt
foo
foocat
foobar
foo
foofighter

使用输出

$ grep -Roniw 'foo' foo.txt
1:foo
4:foo

您可以为初始正则表达式添加更多条件,以匹配一组完整的单词。在评论foofoo-中的示例中,您可以使用:

grep -Roniw 'foo[-]*' foo.txt

输入文件

$ cat foo.txt
foo
foocat
foobar
foo
foofighter
foo-

使用输出

$ grep -Roniw 'foo' foo.txt
1:foo
4:foo
6:foo-

答案 1 :(得分:1)

您可以在大多数(并非所有)扩展RE引擎中使用由\b表示的字边界,并由egrepgrep -E支持。这包括行的开始和结束,以及非alphas。

例如:test.txt:

foo
foobar
foocat
foobar = foocat * 3
foobar = foo++
Feel the foo
What are the foo's price?
Strange how football changes.
Where is foo and bar?

使用:

grep -E '\bfoo\b' test.txt

给出:

foo
foobar = foo++
Feel the foo
What are the foo's price?
Where is foo and bar?

编辑:一些正则表达式引擎使用其他字符序列作为字边界。这里有一个摘要:http://www.regular-expressions.info/refwordboundaries.html

答案 2 :(得分:0)

您需要-v选项:

grep -Rnoi 'foo' * | grep -v 'foobar'

来自grep --help

-v, --invert-match        select non-matching lines