如果满足某些条件,我会尝试匹配一堆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)
答案 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 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)
现在这是仅显示包含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)