Saya sangat mengandalkan pcregrep, tetapi dengan grep yang lebih baru Anda tidak perlu menginstal pcregrep untuk banyak fitur-fiturnya. Gunakan saja grep -P
.
Dalam contoh pertanyaan OP, saya pikir opsi berikut ini berfungsi dengan baik, dengan yang terbaik kedua mencocokkan dengan bagaimana saya memahami pertanyaan:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Saya menyalin teks sebagai / tmp / test1 dan menghapus 'g' dan disimpan sebagai / tmp / test2. Berikut adalah output yang menunjukkan bahwa yang pertama menunjukkan string yang cocok dan yang kedua hanya menunjukkan nama file (khas -o adalah untuk menunjukkan kecocokan dan -l khas adalah hanya menampilkan nama file). Perhatikan bahwa 'z' diperlukan untuk multiline dan '(. | \ N)' berarti untuk mencocokkan 'apa pun selain baris baru' atau 'baris baru' - yaitu apa pun:
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
Untuk menentukan apakah versi Anda cukup baru, jalankan man grep
dan lihat apakah sesuatu yang mirip dengan ini muncul di dekat bagian atas:
-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.
Itu dari GNU grep 2.10.