正则表达式 if then without else in ripgrep

Regex if then without else in ripgrep

如果满足某些条件,我正在尝试匹配一堆 python 脚本中的某些方法。我要查看的第一件事是文件中是否存在 import re,如果存在,则查找 re.sub(something) 的所有情况。我尝试按照文档 here 了解如何在没有 else 正则表达式的情况下使用 if then,但似乎无法使其与带或不带 pcre2 的 ripgrep 一起使用。

我的下一个方法是使用组,所以 rg -n "(^import.+re)|(re\.sub.+)" -r '',但这种方法的问题是因为第一个导入组匹配,我在输出中得到了很多空文件。 </code> 被正确处理。 </p> <p>我希望避免进行 a 或 group 捕获,并尽可能使用 regex if 选项。 </p> <p>总而言之,我希望的是,如果 <code>import re 出现在文件中的任何位置,则搜索 re\.sub.+ 并使用 ripgrep 仅输出匹配的文件和行。使用 ripgrep 是一个硬依赖。

一些示例代码:

import re

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

这可以通过 shell 管道和 xargs 轻松完成。这个想法是使用第一个正则表达式作为要搜索文件的过滤器,第二个正则表达式显示 re.sub 出现的位置。

这里有三个 Python 文件用于测试。

import-without-sub.py 有一个 import re 但没有 re.sub:

import re

for i in range(10):
    re.match(something)
    print(i)

import-with-sub.py 有一个 import re 和一个 re.sub:

import re

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

最后,no-import.py 没有 import re 但有 re.sub:

for i in range(10):
    re.match(something)
    print(i)

re.sub(something)

现在这里的命令仅显示包含 import re:

的文件中 re.sub 的匹配项
rg '^import\s+re$' --files-with-matches --null | xargs -0 rg -F 're.sub('

--files-with-matches--null 打印出所有由 NUL 字节分隔的匹配文件路径。 xargs -0 然后读取这些文件路径并将它们转换为要提供给 rg -F 're.sub(' 的参数。 (我们使用 --null-0 以正确处理包含空格的文件名。)

它在包含上述所有三个文件的目录中的输出是:

import-with-sub.py
7:re.sub(something)