Ole*_*nge 5 grep text-processing
更多的时候我喜欢承认我寻找一个包含一些字符串的文件。
目前我这样做:
grep -rl string1 | xargs grep -l string2 | xargs grep -l string3
Run Code Online (Sandbox Code Playgroud)
有没有更漂亮的工具?
这greps 为string1orstring2或string3。
grep -rl -e string1 -e string2 -e string3
Run Code Online (Sandbox Code Playgroud)
我想包含的文件string1和string2和string3,但不一定在同一行。
也许现代greps ( ag/ack/rg/sift) 之一可以做到这一点?
你可以这样使用grep:
grep -rzlP '(?s)(?=.*?string1)(?=.*?string2)(?=.*?string3)' .
Run Code Online (Sandbox Code Playgroud)
(?s)已知的“dot-all”告诉grep允许点.也匹配\newline 字符。`
(?=.*?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)
| 归档时间: |
|
| 查看次数: |
1120 次 |
| 最近记录: |