sed + Wort vor Zeichenfolge nur hinzufügen, wenn nicht vorhanden

sed + Wort vor Zeichenfolge nur hinzufügen, wenn nicht vorhanden

Wir haben die folgende Zeile in einer Datei unter Linux:

discovery.uri=http://master.navada.com:8800

kokowir möchten das Wort davor hinzufügen master, also mache ich einfach:

sed –i 's/master/kokomaster/' file

Das Ergebnis ist:

discovery.uri=http://kokomaster.navada.com:8800

wir möchten es aber nur hinzufügen, kokowenn kokoes nicht bereits vorher vorhanden ist master.

Wenn wir beispielsweise das nächste Mal

sed –i 's/master/kokomaster/' file

die Zeile lautet:

discovery.uri=http://kokokokomaster.navada.com:8800

Antwort1

sed -i '/kokomaster/!s/master/koko&/' file

Testen Sie zunächst, ob die Zeichenfolge in der Zeile vorhanden ist, und führen Sie die Ersetzung durch, wenn dies nicht der Fall ist. Dies ist fast eine wörtliche Übersetzung von „aber wir möchten das Wort nur kokomasterhinzufügen, wenn es vor dem Wort nicht vorhanden ist“ in .kokokokomastersed

Der &im Ersetzungsteil der Ersetzung enthaltene Text wird durch den Text ersetzt, der mit dem Musterteil übereinstimmt (also master).


Nachdem Sie die Kommentare (siehe unten) gelesen haben, möchten Sie möglicherweise etwas Spezifischeres verwenden, das tatsächlich nur den Servernamenteil der URI ändert und keine Zeichenfolge masteran anderer Stelle, selbst wenn kokomasterdiese im URI-Pfad vorkommt (oder nicht):

sed -i 's,^\(discovery\.uri=http://\)\(master\),\1koko\2,' file

Vielleicht möchten Sie sogar so weit gehen, die genauen undvollZeile, die Sie ersetzen möchten, um auch nur hypothetische Fehler zu vermeiden:

sed -i 's,^\(discovery\.uri=http://\)\(master\.navada\.com:8800\)$,\1koko\2,' file

Wenn die Konfigurationsdatei in JSON oder einem anderen bekannten Format geschrieben ist, würden Siesedüberhaupt nicht verwenden, sondern jqoder ein anderes geeignetes Tool, das speziell für die Handhabung von Dateien dieses Formats geschrieben wurde.

Antwort2

Verwenden

sed 's/\(koko\)*master/kokomaster/'

so masterund eine beliebige Anzahl vorangehender kokos werden ersetzt.

Antwort3

Sie können etwas mehr ersetzen, um dieses Problem zu vermeiden:

sed -i sX/masterX/kokomasterX file

Dies ersetzt „/master“, sodass beim nächsten Ausführen nichts ersetzt wird, da „/kokomaster“ nicht übereinstimmt.

Antwort4

Ich habe den folgenden Awk-Befehl verwendet, um dasselbe zu tun

Befehl

awk '$0 !~/kokomaster/{gsub("master","kokomaster",$0)}1'  filename >file_tmp && mv file_tmp filename

Ausgabe

discovery.uri=http://kokomaster.navada.com:8800
discovery.uri=http://kokomaster.navada.com:8800

verwandte Informationen