Regex если тогда без остального в ripgrep

Я пытаюсь сопоставить некоторые методы в связке сценариев Python, если выполняются определенные условия. Первое, на что я смотрю, это если import re существует в файле, и если это так, то найти все случаи re.sub(something), Я попытался следовать документации здесь о том, как использовать if затем без регулярных выражений, но, похоже, не могу заставить его работать с ripgrep с или без pcre2.

Мой следующий подход заключался в использовании групп, поэтому 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 ответ

Решение

Это можно сделать довольно легко с помощью конвейера оболочки и 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)
Другие вопросы по тегам