我想以任意顺序搜索一大堆文件中的一组单词,有或没有空格或标点符号。所以,例如,如果我搜索hello, there, friend
,它应匹配
hello there my friend
friend, hello there
theretherefriendhello
但不是
hello friend
there there friend
我无法找到任何方法来做到这一点。甚至可以使用grep或grep的某些变体吗?
答案 0 :(得分:2)
您可以使用sed
:
sed -n '/word1/{/word2/{/word3/p;};}' *.txt
答案 1 :(得分:2)
是否可以使用grep或grep的某些变体?
您可以使用grep -P
即Perl
模式,以下正则表达式。
^(?=.*hello)(?=.*there)(?=.*friend).*$
参见演示。
答案 2 :(得分:2)
为此,我会像这样使用awk
:
awk '/hello/ && /there/ && /friend/' file
这会检查当前行是否包含所有字符串:hello
,there
和friend
。如果发生这种情况,则会打印该行
为什么?因为条件为True,当某些内容为True时awk的默认行为是打印当前行。
答案 3 :(得分:2)
在基本和扩展RE中,如果不使用像Perl RE这样的特定于供应商或版本的扩展,您需要使用以下内容来处理:
egrep -lr 'hello.*there.*friend|hello.*friend.*there|there.*hello.*friend|there.*friend.*hello|friend.*hello.*there|friend.*there.*hello' /path/
请注意-l
选项只告诉您文件名,并-r
告诉grep递归搜索。此解决方案应该适用于您可能遇到的grep
的几乎所有变体。
这在RE方面显然不够优雅,但在使用grep的内置递归搜索方面却很方便。如果RE困扰您,我会使用awk
或sed
代替,如果可以的话,请用find
包裹:
find /path/ -exec awk '/hello/&&/there/&&/friend/ {r=1} END {exit 1-r}'\; -print
同样,这是一个文件列表,而不是一个行列表。您可以根据自己的具体要求进行调整。