Holen Sie sich alle Regex-Übereinstimmungen zwischen zwei Mustern und drucken Sie sie in eine Datei

Holen Sie sich alle Regex-Übereinstimmungen zwischen zwei Mustern und drucken Sie sie in eine Datei

Ich habe eine Datei mit einer Reihe langer Zeilen. Ich möchte jede Gruppe zwischen zwei Mustern erfassen und sie in eine neue Datei drucken, eine Übereinstimmung pro Zeile. Ich könnte das mit Python bewerkstelligen, aber ich würde für diese Aufgabe lieber nur Befehlszeilentools verwenden. Wenn es kein Endmuster gibt, möchte ich alles bis zum Ende der Zeile erfassen.

Etwas wie:

input: 
xxSTART relevanttext xxEND something else xxSTART even more relevant

output:
relevanttext
even more relevant

Antwort1

WENN GNU grep eine Option ist, können Sie das -PFlag (Perl-kompatibler regulärer Ausdruck) übergeben und Lookahead-Assertionen, Lookbehind-Assertionen und nicht gierige Übereinstimmungen verwenden, um das herauszuziehen, was Sie benötigen

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP '(?<=START).*?(?=xxEND|$)'
relevanttext
even more relevant

Oder wie Stephane Chazelas vorschlägt, verwenden Sie die raffinierte\Kanstelle der Look-Behind-Assertion

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP 'START\K.*?(?=xxEND|$)' 

verwandte Informationen