Ben pcregrep üzerine büyük ölçüde güveniyordum, ama yeni grep ile birçok özelliği için pcregrep yüklemenize gerek yok. Sadece kullangrep -P
.
OP sorusu örneğinde, aşağıdaki seçeneklerin iyi çalıştığını düşünüyorum, soruyu nasıl anladığımla en iyi ikinci eşleşme:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Metni / tmp / test1 olarak kopyaladım ve 'g'yi sildim ve / tmp / test2 olarak kaydettim. Burada, birincisinin eşleşen dizeyi ve ikincisinin yalnızca dosya adını gösterdiği (tipik -o eşleşmeyi göstermek ve tipik -l yalnızca dosya adını göstermek) gösteren çıktıdır. 'Z' öğesinin çok satırlı satır için gerekli olduğunu ve '(. | \ N)' ifadesinin 'yeni satırdan farklı' veya 'yeni satırdan' eşleşmesi anlamına geldiğini unutmayı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
Sürümünüzün yeterince yeni olup olmadığını belirlemek için, çalıştırın man grep
ve buna benzer bir şeyin üstte görünüp görünmediğine bakın:
-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.
Bu GNU grep 2.10'dan.