Ich kommentiere mal zusammenfassend.
myyers hat geschrieben:Danke!
Soweit ich das verstanden habe, funktioniert `look-ahead/behind' nicht mit
sed search/replace.
Das Konzept von look-* ist den klassischen Unix-Tools fremd. Das kennt man von Perl.
myyers hat geschrieben:
Nun ja, das löscht halt die Klammern, - und setzt sie nachher wieder
ein. Das Problem ist aber, dass die Klammern zuallerst überhaupt nicht
entfernt werden sollen.
Das ist so im portablen sed nicht moeglich. Entweder du weisst was ersetzt wird, dann kannst du es direkt in den Ersatztext schreiben (wie hier) oder du musst Klammern und Rueckwaertsreferenzen verwenden.
wilfried hat geschrieben:sed -e 's/\[.*\]/\[ersatz\]/g' test.txt
In solchen Faellen ist meist /\[[^]]*\]/ was man will.
detix hat geschrieben:Bin mir ja sicher das es bessere Lösungen gibt...
Code: Alles auswählen
echo 'das ist eine [test] klammer' | sed 's/\(.*\[\).*\(\].*\)/\1neue\2/'
das ist eine [neue] klammer
Grundsaetzlich ist es unnoetig den Prefix und Postfix der Zeile manuell zu kopieren. Ersetzt wird ja doch nur worauf das Pattern matcht, der Rest wird ohnehin durchkopiert. Deshalb:
Diese Form ist fuer variable Begrenzer geeignet. Da hier die eckigen Klammern aber fix sind ist die Variante von wilfried einfacher.
Livingston hat geschrieben:Vielleicht liegt ein kleines Missverständnis vor. sed verändert die ursprüngliche Datei (oder allgemeiner: den Eingabestream) nicht. Den Output musst Du ohnehin mit Hilfe von ">" oder "|" einfangen und in eine neue Datei (oder wohin auch immer) umlenken. Insofern wird eigentlich nix ersetzt, sondern durch sed unter Beachtung der regExe was Neues gebaut.
Nein, das ist hier nicht relevant, da myyers sich dessen bewusst ist. Trotzdem danke fuer den Hinweis.