поиск по многострочному шаблону с использованием grep regex - PullRequest
0 голосов
/ 29 мая 2018

Я относительно новичок в Linux. Я хочу найти шаблон в файле, который начинается с "Leonard is" и заканчивается на "champion"

Также этот шаблон может быть помещен в несколько строк

входной файл (input.txt) может выглядеть следующим образом:

1 rabbit eats carrot Leonard is a champion 
2 loin is the king of 
3 jungle Leonard is a 
4 Champion 
5 Leonard is An exemplary 
6 Champion

Я бы хотел, чтобы все вхождения моего шаблона игнорировались всеми другими символами, кроме шаблона в выходном файле:

1 Leonard is a champion
3 Leonard is a
4 Champion
5 Leonard is An exemplary
6 Champion

Я был очень близок со следующей командой:

cat input.txt | grep -ioE "Leonard.*Champion$"

, поскольку эта команда возвращает только

1 Leonard is a champion

, игнорируя все шаблоны, встречающиеся в нескольких строках

Если любой другой подход к поиску, кроме grep, полезен, пожалуйста, дайте мне знать Спасибо !!

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

«. » упоминается как «любой символ , за исключением новой строки », поэтому то, что вы пытаетесь достичь с помощью. невозможно, я предлагаю использовать \ sс добавлением * или + также (как предложено выше), но нужно выяснить, как реализовать это с выражением "grep" reg.Есть также хорошие инструменты для тестирования регулярных выражений - например, https://regexr.com/.

0 голосов
/ 29 мая 2018

Perl для спасения:

perl -l -0777 -e 'print for <> =~ /(.*Leonard(?s:.*?)[Cc]hampion.*)/g' -- input.txt
  • -l добавляет новые строки в печать
  • -0777 читает весь файл, а не обрабатывает его построчно
  • оператор ромба <> читает входные данные
  • .*? похож на .*, то есть соответствует чему угодно, но ? означает, что кратчайшего совпадения достаточно.Это препятствует тому, чтобы регулярное выражение совпадало между первым Леонардом и последним Чемпионом.
  • . в регулярном выражении обычно не соответствует символу новой строки, но это происходит с модификатором s.(?s:.*?) локализует измененное поведение, поэтому другие точки по-прежнему не соответствуют символам новой строки.
0 голосов
/ 29 мая 2018

Вы ищете \s, что означает пробел.+ обозначает один или несколько

Шаблон: Leonard is a\s+Champion

См .: https://regex101.com/r/qiNXhf/1

Я использую этот инструмент с 0 знанием регулярных выражений в моем уме, иЭто мне очень помогает.См. Примечания справа внизу, где объясняются все эти знаки.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...