
Wir haben die folgende Zeile in einer Datei unter Linux:
discovery.uri=http://master.navada.com:8800
koko
wir 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, koko
wenn koko
es 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 kokomaster
hinzufügen, wenn es vor dem Wort nicht vorhanden ist“ in .koko
koko
master
sed
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 master
an anderer Stelle, selbst wenn kokomaster
diese 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 jq
oder ein anderes geeignetes Tool, das speziell für die Handhabung von Dateien dieses Formats geschrieben wurde.
Antwort2
Verwenden
sed 's/\(koko\)*master/kokomaster/'
so master
und eine beliebige Anzahl vorangehender koko
s 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