我正在搜索大型代码库中所有出现的公司缩写词,这是一个小的3个字符的单词,如foo
。我通常用
grep -Rnoi 'foo' *
从代码库的顶部开始。然而,由于这是一个可以产生大量误报的小词,比如'foobar'或'foocat',我怎么能过滤掉误报呢?
我正在思考...... ...
grep -Rnoi 'foo' * | grep [excludeMagicOption] 'foobar'
显示的结果显示没有'foobar'的所有foo事件。这样做有哪些选择?
答案 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
您可以为初始正则表达式添加更多条件,以匹配一组完整的单词。在评论foo
和foo-
中的示例中,您可以使用:
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
表示的字边界,并由egrep
和grep -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