So finden Sie Musterübereinstimmungen in mehreren Zeilen mit grep

So finden Sie Musterübereinstimmungen in mehreren Zeilen mit grep

grep ist ein Befehlszeilen-Textsuchprogramm, das Muster und Zeichenfolgen in Dateien und anderen Eingabetypen finden kann. Die meisten Übereinstimmungen stimmen nur mit einer Zeile überein, aber es ist oft nützlich, mit mehreren Zeilenumbrüchen übereinzustimmen.

Abgleich mehrerer Zeilenumbrüche mit grep

Der Umgang mit mehrzeiligen Übereinstimmungen ist etwas grep , mit dem sie zu kämpfen haben. Das beste Werkzeug für diesen Job ist awk oder sed, das natürlich mehrzeilige Eingaben verarbeitet. Die Verwendung von zwei Ausdrücken mit einem Komma dazwischen stimmt mit allem zwischen diesen beiden Mustern überein.

awk '/from/,/to/' file

sed -n '/from/,/to/p' file

Es ist immer noch möglich, dies in zu tun grep, aber der Befehl ist sehr ungeschickt.

grep -Pz '(?s)from.*n.*to' test

Dies bewirkt mehrere Dinge:

  • -PEnthält einen Perl-kompatiblen regulären Ausdruck .
  • -z übergibt die gesamte Datei als einzelne Zeichenfolge mit „Null-Bytes“ anstelle eines Zeilenumbruchs. Dadurch kann grep alles in einer einzigen Zeile verarbeiten.
  • (?s) schaltet PCRE_DOTALL ein, wodurch . das Zeichen mit jedem Zeichen übereinstimmt, einschließlich Zeilenumbrüchen.
  • from Startspiel.
  • .*n.* passt alles bis to, was das letzte Match ist.

Im Allgemeinen wird dies zu Skriptzwecken gemacht, aber es ist ziemlich viel zu beachten, wenn Sie dies selbst eingeben. Wenn Sie -o das Flag verwenden, um nur die Übereinstimmung zu drucken, wird auch das abschließende Nullbyte gedruckt, was zusätzliche Probleme verursachen kann.

Verwenden Sie stattdessen pcre2grep (Perl-kompatibles grep)

Regular grep ist nicht das beste Werkzeug für diesen Job, und es gibt eine Alternative namens pcre2grep , die standardmäßig Unterstützung für Perl-kompatible reguläre Ausdrücke bietet und mehrzeilige reguläre Ausdrücke sehr einfach abgleichen kann.

Es ist wahrscheinlich auf Ihrem System installiert, aber wenn nicht, können Sie es von Ihrem Paketmanager erhalten:

sudo apt install pcre2-utils

Dann müssen Sie es nur mit einem -M Parameter ausführen.

pcre2grep -M 'from(n|.)*to' file

Beachten Sie, dass dies immer noch erfordert, dass Sie „newline or any character“ manuell mit (n|.)* . Alternativ können Sie (?s) den Trick verwenden, um PCRE_DOTALL zu aktivieren und das Punktzeichen mit dem Zeilenumbruch übereinstimmen zu lassen.

pcre2grep -M '(?s)from.*to' file

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert