sed regex Muster matchte gierig, obwohl es nicht sollte

sed regex Muster matchte gierig, obwohl es nicht sollte

Ich bin auf ein Verhalten gestoßen, das ich nicht erklären kann. Ich hoffe, dass mir jemand von euch weiterhelfen kann.

Ich versuche aus einem größeren Projekt eine Art Dokumentation zu generieren Ant, dabei nutze ich diese um sedaus den Dateien die Informationen zu filtern, die ich später in der Dokumentation brauche.

Ich habe eine normale Ant-Builddatei mit Zeilen wie diesen:

    <target name="targetA" depends="targetD" description="some fancy description">
...
    <target name="targetB" depends="targetD" description="some fancy description">
...
    <target name="targetC" depends="targetD" description="some fancy description">

Jetzt laufe ich mit dieser Sed-Zeile weiter:

sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'

Es sollte mir geben:

 * targetA - some fancy description
 * targetB - some fancy description
 * targetC - some fancy description

Stattdessen erhalte ich:

 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description

Ich habe versucht, die Ausgabe der zweiten Gruppe zu überspringen, um zu überprüfen, ob es sich um die erste Gruppe handelt, die tatsächlich mit dem gesamten „hängt davon ab“-Teil übereinstimmt, obwohl ich den regulären Ausdruck so eingestellt habe, dass er bis zum nächsten Anführungszeichen nicht gierig ist.

Was übersehe ich hier?

Die Verwendung eines expliziteren regulären Ausdrucks wie diesem funktioniert wie erwartet, aber ich verstehe die Sache mit der Greedy immer noch nicht:

sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'

Da dies von Interesse sein könnte, verwende ich sed-4.2.2-4ubuntu1 unter Ubuntu Linux (Standardinstallation).

Antwort1

Sed unterstützt keine nicht-gierigen Übereinstimmungen wie im Ausdruck „.*?“.

Versuche dies:

sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file

Ausgabe:

* targetA - eine ausgefallene Beschreibung
 * targetB - eine ausgefallene Beschreibung
 * targetC - eine ausgefallene Beschreibung

verwandte Informationen