我正在寻找一种快速方法来查找文件夹中包含 2 个或更多模式的所有文件
grep -l -e foo -e bar ./*
或者
rg -l -e foo -e bar
在同一行中显示所有包含“foo”和“bar”的文件,或者在不同行中显示包含“foo”或“bar”的所有文件,但我只想要在不同行中至少有一个“foo”匹配和一个“bar”匹配的文件. 只有 'foo' 匹配或只有 'bar' 匹配的文件将被过滤掉。
我知道我可以链接 grep 调用,但这太慢了。
$ cat f1
afoot
2bar
$ cat f2
foo bar
$ cat f3
foot
$ cat f4
bar
$ cat f5
barred
123
foo3
$ rg -Ul '(?s)foo.*?\n.*?bar|bar.*?\n.*?foo'
f5
f1
您可以使用-U
选项跨行匹配。该s
标志也可以.
匹配换行符。由于您希望匹配跨越不同的行,因此您还需要在搜索词之间匹配换行符。
如果要搜索出现在多行中的两个或多个单词,除了提供/之外,还可以使用ripgrep
's 选项。您还需要在使用运算符之前和之前进行搜索:--multiline-dotall
-U
--multiline
foo
bar
bar
foo
|
rg -lU --multiline-dotall 'foo.*bar|bar.*foo' .
对于任意数量的单词,您需要|
这些单词的所有排列。为此,我使用了一个小的 python 脚本(我称之为rga
),它在当前目录(和向下)中搜索包含命令行上给出的所有参数的文件:
#! /opt/util/py310/bin/python
import sys
import subprocess
from itertools import permutations
rgarg = '|'.join(('.*'.join(x) for x in permutations(sys.argv[1:])))
cmd = ['rg', '-lU', '--multiline-dotall', rgarg, '.']
# print(' '.join(cmd))
proc = subprocess.run(cmd, capture_output=True)
sys.stdout.write(proc.stdout.decode('utf-8'))
我已经用六个参数成功搜索,上面的命令行变得很长。可能有办法通过将参数保存到文件并添加来解决这个问题-f file_name
,但我从来不需要/调查过。