我正在寻找一种快速的方法来查找文件夹中包含2个或更多模式的所有文件
grep -l -e foo -e bar ./*或rg -l -e foo -e bar
显示在同一行中包含'foo‘和'bar’或在不同行中包含'foo‘或'bar’的所有文件,但我只希望在不同行中至少有一个'foo‘匹配和一个'bar’匹配的文件。只有'foo‘匹配或只有'bar’匹配的文件将被过滤掉。
我知道我可以链接grep调用,但这太慢了。
发布于 2021-11-08 07:21:57
如果要搜索出现在多行中的两个或多个单词,除了提供-U/--multiline之外,还可以使用ripgrep的选项--multiline-dotall。您还需要在bar之前搜索foo,在foo之前使用|运算符搜索bar:
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来解决这个问题,但是我从来不需要这样做。
发布于 2019-11-26 22:16:42
$ 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标志还将使.能够匹配换行符。由于您希望匹配项跨不同的行,因此还需要在搜索词之间匹配换行符。
https://stackoverflow.com/questions/59052703
复制相似问题