Я багато в чому покладався на pcregrep, але при більш новій грепі вам не потрібно встановлювати pcregrep для багатьох його функцій. Просто використовуйте grep -P
.
На прикладі питання щодо ОП, я думаю, що наступні варіанти чудово працюють, і другий найкращий варіант відповідає тому, як я розумію питання:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Я скопіював текст як / tmp / test1 і видалив 'g' та зберег у вигляді / tmp / test2. Ось висновок, який показує, що перший показує відповідні рядки, а другий показує лише ім'я файлу (типово -o означає показ відповідності, а типовий -l - показ лише імені файлу). Зауважте, що "z" необхідний для багаторядкових, а "(. | \ N)" означає, щоб відповідати "нічого, крім нового рядка", або "нового рядка" - тобто нічого:
user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1
Щоб визначити, чи достатньо нова ваша версія, запустіть man grep
і подивіться, чи з’являється щось подібне до цієї вершини:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
Тобто з GNU grep 2.10.