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)