Beispiel:
1:20 2:25 3:0.432 2:-17 10:12
Ich möchte alle Zeichenfolgen ersetzen, die beginnen mit 2:
zu 2:0
.
Ausgabe:
1:20 2:0 3:0.432 2:0 10:12
Akzeptierte Antwort:
Mit sed
:
sed -E 's/((^| )2:)[^ ]*/\10/g' in > out
Auch, wie von souravcs Antwort inspiriert, wenn es nicht gibt eine Chance auf 2:
substring nach dem Anfang eines Strings nicht mit einem vorangestellten 2:
Teilstring (z. B. gibt es not eine Chance auf 1:202:25
Zeichenfolge, die der folgende verkürzte Befehl durch 1:202:0
ersetzen würde ), könnte der Befehl wie folgt abgekürzt werden:
sed -E 's/2:[^ ]*/2:0/g' in > out
Aufschlüsselung von Befehl Nr. 1 / Nr. 2 :
-E
:machtsed
das Muster als ERE-Muster (Extended Regular Expression) interpretieren;> out
:leitetstdout
um zuout
;
sed
Befehl Nr. 1 Aufschlüsselung :
s
:behauptet, eine Ersetzung durchzuführen/
:Startet das Muster(
:startet die einfangende Gruppe(
:Beginnt mit der Gruppierung der zulässigen Zeichenketten^
:entspricht dem Anfang der Zeile|
:trennt den zweiten erlaubten String:entspricht einem
Charakter
)
:stoppt die Gruppierung der erlaubten Strings2
:entspricht einem2
Charakter:
:entspricht einem:
Charakter)
:stoppt die einfangende Gruppe[^ ]*
:stimmt mit einer beliebigen Anzahl von Zeichen überein, außer/
:stoppt das Muster / startet den Ersatzstring\1
:Rückverweis durch die erste einfangende Gruppe ersetzt:fügt einen
hinzu Charakter
/
:stoppt den Ersetzungsstring / startet die Musterflagsg
:behauptet, die Ersetzung global durchzuführen, d. h. jedes Vorkommen des Musters in der Zeile zu ersetzen
sed
Befehl #2 Aufschlüsselung :
s
:behauptet, eine Ersetzung durchzuführen/
:Startet das Muster2
:entspricht einem2
Charakter:
:entspricht einem:
Charakter[^ ]*
:stimmt mit einer beliebigen Anzahl von Zeichen überein, außer/
:stoppt das Muster / startet den Ersatzstring2:0
:fügt ein2:0
hinzu Zeichenfolge/
:stoppt den Ersetzungsstring / startet die Musterflagsg
:behauptet, die Ersetzung global durchzuführen, d. h. jedes Vorkommen des Musters in der Zeile zu ersetzen