Ich habe mich stark auf pcregrep verlassen, aber mit neuerem grep müssen Sie pcregrep für viele seiner Funktionen nicht installieren. Einfach benutzen grep -P
.
Im Beispiel der OP-Frage denke ich, dass die folgenden Optionen gut funktionieren, wobei die zweitbeste zu meinem Verständnis der Frage passt:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Ich habe den Text als / tmp / test1 kopiert und das 'g' gelöscht und als / tmp / test2 gespeichert. Hier ist die Ausgabe, die zeigt, dass die erste die übereinstimmende Zeichenfolge und die zweite nur den Dateinamen anzeigt (typisch -o zeigt Übereinstimmung an und typisch -l zeigt nur Dateinamen an). Beachten Sie, dass das 'z' für mehrzeilig erforderlich ist und das '(. | \ N)' bedeutet, dass entweder 'irgendetwas anderes als Zeilenumbruch' oder 'Zeilenumbruch' übereinstimmt - dh alles:
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
Um festzustellen, ob Ihre Version neu genug ist, führen Sie sie aus man grep
und prüfen Sie, ob oben etwas Ähnliches angezeigt wird:
-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.
Das ist aus GNU grep 2.10.