Grep正则表达式以任何顺序查找单词

时间:2011-05-06 18:43:32

标签: regex grep

上下文:我想在很多源代码文件中找到一个类定义,但我不知道确切的名称。

问题:我知道必须出现在我想要查找的行上的一些单词,但我不知道它们出现的顺序。有没有一种快速的方法可以在同一行上查找在任何顺序中的多个单词?

5 个答案:

答案 0 :(得分:5)

对于需要搜索大量单词的情况,可以按如下方式使用awk:

awk "/word1/&&/word2/&&/word3/" *.c

(如果您是cygwin用户,则命令为gawk。)

答案 1 :(得分:2)

使用标准基本正则表达式从当前目录开始递归匹配任何.c文件和指定的单词(大小写, bash 风味):

grep -r -i 'word1\|word2\|word3' ./*.c

使用标准扩展正则表达式:

grep -r -i -E 'word1|word2|word3' ./*.c

您也可以使用perl正则表达式:

grep -r -i -P 'word1|word2|word3' ./*.c

答案 2 :(得分:1)

如果你想找foo,bar和baz,你可以这样做:

grep foo *.c | grep bar | grep baz

那将找到任何以任何顺序排列所有三个的东西。如果使用egrep,则可以使用单词边界,否则将匹配子字符串。

答案 3 :(得分:0)

虽然这不是您的grep问题的准确答案,但您应该检查“ctags”命令以从源代码生成标记文件。对于源代码对象,这应该不仅仅是一个简单的grep。检查:http://ctags.sourceforge.net/ctags.html

答案 4 :(得分:0)

如果需要使用单个grep命令进行搜索(例如,在stdin上搜索多个模式替代),可以使用:

grep -e 'word1.*word2' -e 'word2.*word1' -e 'alternative-word'

这会找到 word1 word2 的任何顺序, 替代词。< / p>

(请注意,随着任意顺序的单词数量的增加,此方法会呈指数级复杂化。)