(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.