![Holen Sie sich alle Regex-Übereinstimmungen zwischen zwei Mustern und drucken Sie sie in eine Datei](https://rvso.com/image/50567/Holen%20Sie%20sich%20alle%20Regex-%C3%9Cbereinstimmungen%20zwischen%20zwei%20Mustern%20und%20drucken%20Sie%20sie%20in%20eine%20Datei.png)
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 -P
Flag (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|$)'