我可以使用以下方法搜索包含特定单词的文件grep
grep -l "word" /path
但是,如果我想搜索同一行包含“单词 1”和“单词 2”的文件怎么办?我可以使用:
mkdir new;for i in * do;grep "word 1" $i > new/$i_new;done
然后使用
grep -l "word 2" /new
但我希望有一个单行命令。使用
egrep -w -R 'word 1|word 2' /path
仅搜索包含“单词 1”或“单词 2”的行。
如果我有“单词 3”、“单词 4”怎么办?
答案1
使用管道逐行过滤,直到得到你想要的结果:grep word1 /path | grep word2 | grep word3 | grep word4
答案2
如果每行有 N 个单词,会发生什么情况?那么您必须使用 N 个管道grep
命令?
grep word1 /path | grep word2 | grep word3 | grep word4 | grep word5 | ... | grep wordN
如果包含多个单词,则这里仅使用一行grep
并匹配:
grep -E 'word1.*word2.*word3.*word4.*' /path
上述命令使用 grep-E
选项模拟 AND。如果行中的单词顺序相同,此命令将起作用;如果行如下所示,此命令将失败:
word4 and word3 and word2 and word1
那么按任意顺序进行/查找匹配的新想法是什么?
这个想法是使用带有-P
(Perl-Compatibility)选项的 grep 和前瞻正则表达式(?=(regex))
:
grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
- 表示
.*?
匹配所有.
重复零次或多次的*
可选字符。 表示匹配?
其前面的所有内容(表示匹配的所有内容出现零次或一次.*
)