9

我正在寻找一种快速方法来查找文件夹中包含 2 个或更多模式的所有文件

grep -l -e foo -e bar ./* 或者 rg -l -e foo -e bar

在同一行中显示所有包含“foo”和“bar”的文件,或者在不同行中显示包含“foo”或“bar”的所有文件,但我只想要在不同行中至少有一个“foo”匹配和一个“bar”匹配的文件. 只有 'foo' 匹配或只有 'bar' 匹配的文件将被过滤掉。

我知道我可以链接 grep 调用,但这太慢了。

4

2 回答 2

4
$ 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标志也可以.匹配换行符。由于您希望匹配跨越不同的行,因此您还需要在搜索词之间匹配换行符。

于 2019-11-26T14:16:41.550 回答
4

如果要搜索出现在多行中的两个或多个单词,除了提供/之外,还可以使用ripgrep's 选项。您还需要在使用运算符之前和之前进行搜索:--multiline-dotall-U--multilinefoobarbarfoo|

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,但我从来不需要/调查过。

于 2021-11-08T07:21:56.837 回答