GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Mehrzeiliger Musterabgleich mit Sed, Awk oder Grep?

Für diese Frage gibt es hier bereits Antworten :Wie kann ich Muster über mehrere Zeilen „grep“?

(9 Antworten)
Vor 2 Jahren geschlossen.

Ist es möglich, einen mehrzeiligen Musterabgleich mit sed durchzuführen , awk oder grep ? Nehmen wir zum Beispiel, ich möchte alle Zeilen zwischen { erhalten und }

Es sollte also übereinstimmen können

 1. {}
 2. {.....}
 3. {.....
.....}

Anfänglich verwendete die Frage <p> als Beispiel. Die Frage wurde so bearbeitet, dass sie { verwendet und} .

Akzeptierte Antwort:

Obwohl ich dem obigen Rat zustimme, dass Sie einen Parser für alles andere als winzig oder komplett ad-hoc benötigen werden, ist es (kaum 😉 möglich, mehrzeilige Blöcke zwischen geschweiften Klammern mit sed zu finden.

Hier ist eine Debugging-Version des sed-Codes

sed -n '/[{]/,/[}]/{
    p
    /[}]/a
     end of block matching brace

    }' *.txt

Einige Anmerkungen,

  • -n bedeutet „keine standardmäßigen Druckzeilen wie verarbeitet“.
  • „p“ bedeutet jetzt Drucke die Zeile.
  • Das Konstrukt /[{]/,/[}]/ ist ein Bereichsausdruck. Es bedeutet scannen, bis Sie etwas finden, das mit dem ersten Muster (/[{]/) übereinstimmt UND scannen Sie dann, bis Sie das zweite Muster (/[}]/) finden Führen Sie DANN alle Aktionen aus, die Sie zwischen den { } im Sed-Code finden. In diesem Fall „p“ und der Debugging-Code. (hier nicht erklärt, verwenden, modifizieren oder entfernen, wie es für Sie am besten funktioniert).

Sie können das /[}]/a-Ende des Block-Debuggings entfernen, wenn Sie zu Ihrer Zufriedenheit beweisen, dass der Code wirklich mit Blöcken übereinstimmt, die durch {,}.

getrennt sind

Dieses Codebeispiel überspringt alles, was sich nicht in geschweiften Klammern befindet.
Es wird, wie von anderen oben angemerkt, leicht verwirrt, wenn Sie zusätzliche {,} in Zeichenfolgen, Reg-Ausdrücke usw. eingebettet haben, ODER wobei die schließende Klammer dieselbe Zeile ist , (mit Dank an fred.bear)

Ich hoffe, das hilft.


Linux
  1. Verwenden von Sed zum Suchen und Ersetzen einer Linie zwischen Musterbereichen

  2. Vorherige Zeile nach einer Musterübereinstimmung mit Sed drucken?

  3. Muster ersetzen, nachdem N-te Übereinstimmung in jeder Zeile gefunden wurde??

  4. Sed:Nur das erste Auftreten einer Musterübereinstimmung drucken?

  5. Nur das erste Vorkommen nur mit Grep finden?

So führen Sie eine Mustersuche in Dateien mit Grep durch

So löschen Sie leere Zeilen in Dateien mit Grep, Sed und Awk

Wie kann ich in einer Datei nach einem mehrzeiligen Muster suchen?

Großschreibung des ersten Buchstabens von Wörtern mit SED

Entferne ein bestimmtes Zeichen mit awk oder sed

Wie ändere ich eine Datei direkt mit awk? (wie bei sed -i)