如果没有,则在reggrep中使用正则表达式

时间:2019-05-08 22:18:36

标签: regex ripgrep

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

我的下一个方法是使用组,所以使用rg -n "(^import.+re)|(re\.sub.+)" -r '$2',但是此方法的问题在于,因为第一个导入组匹配,所以我的输出中返回了很多空文件。 $2被正确处理。

我希望避免进行“或”组捕获,并在可能的情况下使用正则表达式。

总而言之,我希望的是,如果import re出现在文件中的任何位置,然后搜索re\.sub.+并使用ripgrep仅输出匹配的文件和行。使用ripgrep非常困难。

一些示例代码:

import re

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

re.sub(something)

1 个答案:

答案 0 :(得分:1)

这可以通过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 rere.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)

现在这是仅显示包含re.sub的文件中import re的匹配项的命令:

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)