Um genau zu sein
Some text
begin
Some text goes here.
end
Some more text
und ich möchte einen ganzen Block extrahieren, der von "begin" bis "end" beginnt.
mit awk können wir gerne machen awk '/begin/,/end/' text
.
Wie mache ich mit grep?
Um genau zu sein
Some text
begin
Some text goes here.
end
Some more text
und ich möchte einen ganzen Block extrahieren, der von "begin" bis "end" beginnt.
mit awk können wir gerne machen awk '/begin/,/end/' text
.
Wie mache ich mit grep?
Antworten:
Aktualisiert am 18. November 2016 (da das Grep-Verhalten geändert wurde: Grep mit -P-Parameter wird jetzt nicht unterstützt
^
und$
Anker [unter Ubuntu 16.04 mit Kernel v: 4.4.0-21-generic]) ( falsches (nicht-) Update )Hinweis: Für andere Befehle ersetzen Sie einfach die Anker '^' & '$' durch Anker mit neuer Zeile.
'\n'
______________________________Mit grep Befehl:
Wenn Sie die Muster "begin" und "end" nicht in das Ergebnis aufnehmen möchten, verwenden Sie grep mit Lookbehind- und Lookahead-Unterstützung.
Sie können auch
\K
notify anstelle von Lookbehind Assertion verwenden.\K
Option ignoriere alles vor dem Mustervergleich und ignoriere das Muster selbst.\n
Dient zum Vermeiden des Druckens leerer Zeilen aus der Ausgabe.Oder, wie @AvinashRaj andeutet, gibt es einfach leicht grep wie folgt:
(?s)
Weist grep an, den Punkt mit Zeilenumbrüchen abzustimmen.[\s\S]
Stimmt mit jedem Zeichen überein, das entweder ein Leerzeichen oder ein Nicht-Leerzeichen ist.Und ihre Ausgabe ohne "begin" und "end" ist wie folgt:
Den vollständigen Test aller Befehle finden Sie hier ( veraltet, da das Grep-Verhalten mit dem -P-Parameter geändert wurde ).
Hinweis:
^
Zeigen Sie auf den Anfang einer Linie und$
auf das Ende einer Linie. Diese werden zu den Übereinstimmungen "Anfang" und "Ende" hinzugefügt, wenn sie alleine in einer Zeile stehen.In zwei Befehlen bin ich geflüchtet,
$
weil es auch "Command Substitution" ($(command)
) verwendet, mit der die Ausgabe eines Befehls den Befehlsnamen ersetzen kann.Vom mann grep:
quelle
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
, um\n
Zeichen, die in der Zeile vorhanden sind , nicht zu drucken .grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
Die Übersetzung des Fehlersgrep: a not protected ^ or $ is not supported with -Pz
grep
scheint sich geändert zu haben.Falls Sie
grep
die Perl-Syntax (-P
) nicht unterstützen , können Sie versuchen, die Linien zu verbinden, das Muster anzupassen und die Linien dann wie folgt erneut zu erweitern:quelle