In einem POSIX-Shell-Skript muss ich alle Vorkommen von Text innerhalb von {{
und }}
finden und den Text zusammen mit den umgebenden Klammern durch ein Sternchen ersetzen.Wie wird zwischen einem Start-Delimiter und einem End-Delimiter verglichen, so dass der Text nicht den End-Delimiter enthält (d. H. Nicht-gierige Übereinstimmung)?
Zum Beispiel, wenn der Eingang
{{ abc }} def {{ ghi {jkl} mno }} pqr
dann muss der Ausgang seine
* def * pqr
Ich habe dies mit einem sed
Befehl kommt nicht in der Lage gewesen, das funktioniert.
Ich habe ein paar Befehle ausprobiert, aber sie funktionieren nicht. Der folgende Befehl erzeugt z. B. nicht die gewünschte Ausgabe, da sed
gierige Übereinstimmung ergibt. Es entspricht {{ abc }} def {{ ghi {jkl} mno }}
als erste Übereinstimmung statt nur {{ abc }}
.
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{.*}}/*/g'
* pqr
Hier ist ein weiteres Beispiel, das, weil es zu wenig passende endet nicht funktioniert. Es passt nicht {{ ghi {jkl} mno }}
(die wir übereinstimmen möchten), da dieser Teil der Zeichenfolge darin }
enthält.
$ echo "{{ abc }} def {{ ghi {jkl} mno }} pqr" | sed 's/{{[^}]*}}/*/g'
* def {{ ghi {jkl} mno }} pqr
Wie kann ich sonst so ein Match machen?
Ich habe durch Non greedy regex matching in sed? gegangen, aber die Lösungen dort nicht helfen, weil ich hier alles zwischen {{
und }}
mit Ausnahme einer bestimmten Folge von zwei aufeinanderfolgenden Zeichen übereinstimmen soll, das heißt }}
. Wenn ich versuchen würde, zwischen den Trennzeichen alles außer einem einzelnen Zeichen abzugleichen, hätten die Antworten auf diese Frage geholfen.