首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grep或ripgrep:如何只查找匹配多个模式的文件(不仅仅是在同一行上)?

grep或ripgrep:如何只查找匹配多个模式的文件(不仅仅是在同一行上)?
EN

Stack Overflow用户
提问于 2019-11-26 22:04:44
回答 2查看 2.2K关注 0票数 6

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

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

显示在同一行中包含'foo‘和'bar’或在不同行中包含'foo‘或'bar’的所有文件,但我只希望在不同行中至少有一个'foo‘匹配和一个'bar’匹配的文件。只有'foo‘匹配或只有'bar’匹配的文件将被过滤掉。

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

EN

回答 2

Stack Overflow用户

发布于 2021-11-08 07:21:57

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

代码语言:javascript
复制
rg -lU --multiline-dotall 'foo.*bar|bar.*foo' .

对于任意数量的单词,您需要对这些单词的所有排列进行|。为此,我使用了一个小的python脚本(我称之为rga),它在当前目录(以及以下目录)中搜索包含命令行中给定的所有参数的文件:

代码语言:javascript
复制
#! /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来解决这个问题,但是我从来不需要这样做。

票数 4
EN

Stack Overflow用户

发布于 2019-11-26 22:16:42

代码语言:javascript
复制
$ 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标志还将使.能够匹配换行符。由于您希望匹配项跨不同的行,因此还需要在搜索词之间匹配换行符。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59052703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档