Мне нужно было найти все файлы, содержащие определенный строковый шаблон. Первое решение, которое приходит на ум, - использовать find piped с xargs grep :
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
Но если мне нужно найти шаблоны, которые занимают более одной строки, я застрял, потому что vanilla grep не может найти многострочные шаблоны.
Ответы:
Так я открыл для себя pcregrep, что означает Perl-совместимые регулярные выражения GREP .
Например, вам нужно найти файлы, в которых сразу за переменной ' _name ' следует переменная ' _description ':
Совет: вам необходимо включить в шаблон символ разрыва строки. В зависимости от вашей платформы это может быть '\ n', \ r ',' \ r \ n ', ...
источник
pcregrep
доступно на Mac сbrew install pcre
-H
который печатает имя файла перед каждым матчем:pcregrep -HM
.Почему бы тебе не пойти на awk :
источник
awk
которое есть в большинстве систем * nix.awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename
. Вы можете сделать это похорошела, давая номера строк фиксированной ширины:awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
.Вот пример использования GNU
grep
:Также здесь
источник
-z
поэтому он не разделяет поиск на одну строку и-o
печатает только совпадающую часть.grep -rzl pattern *
, -rzo не сработала)brew reinstall --with-pcre git
grep -P
также использует libpcre, но установлен гораздо шире. Чтобы найти полныйtitle
раздел html-документа, даже если он занимает несколько строк, вы можете использовать это:Поскольку проект PCRE реализует стандарт Perl, используйте документацию perl для справки:
источник
Вот более полезный пример:
Он ищет тег заголовка в html-файле, даже если он занимает до 5 строк.
Вот пример неограниченного количества строк:
источник
(?s)
в свое регулярное выражение, например:"(?s)<html>.*</html>"
$
(в конце шаблона), чтобы обозначить, что это конец строки - хотя это не то же самое, что помочь вам найти несколько шаблонов линий. См. Такжеglob(7)
. Вы также можете найти этот сайт интерес: regular-expressions.infoС серебряным искателем :
Здесь могут проявиться оптимизации скорости серебряного поисковика.
источник
Вы можете использовать альтернативный фильтр grep здесь (отказ от ответственности: я являюсь автором).
Он поддерживает многострочное сопоставление и ограничение поиска определенными типами файлов из коробки:
(поиск во всех файлах * .py указанного шаблона многострочного регулярного выражения)
Он доступен для всех основных операционных систем. Взгляните на страницу примеров, чтобы увидеть, как ее можно использовать для извлечения многострочных значений из файла XML.
источник
Этот ответ может быть полезен:
Регулярное выражение (grep) необходимо для многострочного поиска
Для рекурсивного поиска вы можете использовать флаги -R (рекурсивный) и --include (шаблон GLOB). Видеть:
Используйте синтаксис grep --exclude / - include, чтобы не просматривать определенные файлы с помощью grep
источник
@Marcin: пример awk нежадный:
источник
источник
Использование
ex
/vi
editor и опции globstar (синтаксис аналогиченawk
иsed
):где
aaa
ваша отправная точка иbbb
ваш конечный текст.Для рекурсивного поиска попробуйте:
Примечание. Чтобы включить
**
синтаксис, запуститеshopt -s globstar
(Bash 4 или zsh).источник