Ole*_*nge 5 grep text-processing
更多的时候我喜欢承认我寻找一个包含一些字符串的文件。
目前我这样做:
grep -rl string1 | xargs grep -l string2 | xargs grep -l string3
Run Code Online (Sandbox Code Playgroud)
有没有更漂亮的工具?
这grep
s 为string1
orstring2
或string3
。
grep -rl -e string1 -e string2 -e string3
Run Code Online (Sandbox Code Playgroud)
我想包含的文件string1
和string2
和string3
,但不一定在同一行。
也许现代grep
s ( ag/ack/rg/sift
) 之一可以做到这一点?
你可以这样使用grep
:
grep -rzlP '(?s)(?=.*?string1)(?=.*?string2)(?=.*?string3)' .
Run Code Online (Sandbox Code Playgroud)
(?s)
已知的“dot-all”告诉grep允许点.
也匹配\n
ewline 字符。`
(?=.*?pattern)
: Positive Lookahead,匹配.
出现零次或多次*
且非贪婪后跟模式( string1
, string2
, ...) 的任何字符。
您可以创建如下函数(POSIX bash
& zsh
):
mgrep() { eval grep -rzlP $(printf ''\''(?s)';
printf '(?=.*?'\''"$%d"'\'')' $(eval echo {1..$#}); printf ''\''') . ; }
Run Code Online (Sandbox Code Playgroud)
然后按如下方式调用,它将在当前工作目录中递归查找包含所有模式的文件。
mgrep string1 string2 string3
Run Code Online (Sandbox Code Playgroud)
它还可以处理grep
自身支持的任何类型的模式(根据您的要求提前调整grep
功能中的选项)。
mgrep string 'pattern with space' '\d+' [0-9] [...]
Run Code Online (Sandbox Code Playgroud)