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:machtseddas Muster als ERE-Muster (Extended Regular Expression) interpretieren;> out:leitetstdoutum 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 einemCharakter):stoppt die Gruppierung der erlaubten Strings2:entspricht einem2Charakter::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 einenhinzu 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 einem2Charakter::entspricht einem:Charakter[^ ]*:stimmt mit einer beliebigen Anzahl von Zeichen überein, außer/:stoppt das Muster / startet den Ersatzstring2:0:fügt ein2:0hinzu Zeichenfolge/:stoppt den Ersetzungsstring / startet die Musterflagsg:behauptet, die Ersetzung global durchzuführen, d. h. jedes Vorkommen des Musters in der Zeile zu ersetzen