Вопрос

Мне нужно было найти все файлы, содержащие определенный шаблон строки.Первое решение, которое приходит на ум, — использовать находить по трубопроводу с xargs grep:

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

Но если мне нужно найти шаблоны, занимающие более одной строки, я застряну, потому что ванильный grep не может найти многострочные шаблоны.

Это было полезно?

Решение

Итак, я обнаружил pcregrep что означает Perl-совместимые регулярные выражения GREP.

Например, вам нужно найти файлы, в которых '_имяЗа переменной ' сразу следует '_описание' переменная:

find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'

Кончик:вам нужно включить символ разрыва строки в ваш шаблон.В зависимости от вашей платформы это может быть ' ', ', ' ',...

Другие советы

Почему бы тебе не пойти на ок:

awk '/Start pattern/,/End pattern/' filename

Вот пример использования ГНУ grep:

grep -Pzo '_name.*\n.*_description'

-z/--null-data Рассматривайте входные и выходные данные как последовательности строк.

Смотрите также здесь

grep -P также использует libpcre, но много более широко установлен.Чтобы найти полную title раздел html-документа, даже если он занимает несколько строк, вы можете использовать это:

grep -P '(?s)<title>.*</title>' example.html

С проект PCRE реализуется в соответствии со стандартом Perl, для справки используйте документацию Perl:

Вот более полезный пример:

pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html

Он ищет тег заголовка в html-файле, даже если он занимает до 5 строк.

Вот пример неограниченных строк:

pcregrep -Mi "(?s)<title>.*</title>" example.html 

С искатель серебра:

ag 'abc.*(\n|.)*efg'

Здесь могла бы проявиться оптимизация скорости поиска серебра.

Вы можете использовать альтернативу grep просеять здесь (отказ от ответственности:Я автор).

Он поддерживает многострочное сопоставление и ограничение поиска определенными типами файлов «из коробки»:

sift -m --files '*.py' 'YOUR_PATTERN'

(поиск во всех файлах *.py для указанного шаблона многострочного регулярного выражения)

Он доступен для всех основных операционных систем.Взгляните на страница образцов чтобы увидеть, как его можно использовать для извлечения многострочных значений из файла XML.

Этот ответ может быть полезен:

Требуется регулярное выражение (grep) для многострочного поиска.

Для рекурсивного поиска вы можете использовать флаги -R (рекурсивный) и --include (шаблон GLOB).Видеть:

Используйте синтаксис grep --exclude/--include, чтобы не просматривать определенные файлы.

perl -ne 'print if (/begin pattern/../end pattern/)' filename

С использованием ex/vi редактор и вариант глостар (синтаксис аналогичен awk и sed):

ex +"/string1/,/string3/p" -R -scq! file.txt

где aaa ваша отправная точка, и bbb это ваш конечный текст.

Для рекурсивного поиска попробуйте:

ex +"/aaa/,/bbb/p" -scq! **/*.py

Примечание:Включить ** синтаксис, запустить shopt -s globstar (Bash 4 или zsh).

@Марцин:пример awk без жадности:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top