Beispiel:
1:20 2:25 3:0.432 2:-17 10:12
Ich möchte alle Zeichenfolgen ersetzen, die mit 2:
to beginnen2:0
.
Ausgabe:
1:20 2:0 3:0.432 2:0 10:12
Beispiel:
1:20 2:25 3:0.432 2:-17 10:12
Ich möchte alle Zeichenfolgen ersetzen, die mit 2:
to beginnen2:0
.
Ausgabe:
1:20 2:0 3:0.432 2:0 10:12
2:
genau passenden Strings ? Sollten diese ersetzt werden?Antworten:
Verwenden von
sed
:Auch, wie inspiriert souravc Antwort , wenn es nicht eine Chance auf einen
2:
Teilstring nach dem Beginn eines Strings nicht ein führendes enthält2:
String (zB gibt es nicht eine Chance auf eine1:202:25
Zeichenfolge, die der folgende Kurzbefehl ersetzen würde1:202:0
), das Befehl kann auf diesen verkürzt werden:Befehl # 1 / # 2 Aufschlüsselung :
-E
: lässtsed
das Muster als ERE-Muster (Extended Regular Expression) interpretieren;> out
: leitet weiterstdout
zuout
;sed
Befehl # 1 Aufschlüsselung :s
: behauptet, eine Substitution durchzuführen/
: Startet das Muster(
: Startet die Erfassungsgruppe(
: Startet die Gruppierung der zulässigen Zeichenfolgen^
: Entspricht dem Zeilenanfang|
: trennt die zweite zulässige Zeichenfolge: Entspricht einem
Zeichen
)
: Beendet die Gruppierung der zulässigen Zeichenfolgen2
: Entspricht einem2
Zeichen:
: Entspricht einem:
Zeichen)
: Stoppt die Erfassungsgruppe[^ ]*
: Entspricht einer beliebigen Anzahl von Zeichen nicht/
: stoppt das Muster / startet die Ersatzzeichenfolge\1
: Rückreferenz durch die erste Erfassungsgruppe ersetzt0
: fügt ein0
Zeichen hinzu/
: stoppt die Ersatzzeichenfolge / startet die Musterflagsg
: behauptet, die Ersetzung global durchzuführen, dh jedes Vorkommen des Musters in der Zeile zu ersetzensed
Befehl # 2 Aufschlüsselung :s
: behauptet, eine Substitution durchzuführen/
: Startet das Muster2
: Entspricht einem2
Zeichen:
: Entspricht einem:
Zeichen[^ ]*
: Entspricht einer beliebigen Anzahl von Zeichen nicht/
: stoppt das Muster / startet die Ersatzzeichenfolge2:0
: fügt eine2:0
Zeichenfolge hinzu/
: stoppt die Ersatzzeichenfolge / startet die Musterflagsg
: behauptet, die Ersetzung global durchzuführen, dh jedes Vorkommen des Musters in der Zeile zu ersetzenquelle
Dieser eine Liner mit
sed
wird ersetzen global in Zeile in
input_file
eine Backup - Datei mit dem Namen hältinput_file.bkp
im gleichen Verzeichnis.Dies kann weiter verkürzen erweiterte reguläre Ausdrücke verwenden , wie vorgeschlagen von kos, wie
quelle
2:
und2:-
nur die-
optionale Übereinstimmung mit erweiterten regulären Ausdrücken vornehmen möchten (-r
Option); Außerdem müssen Sie nichts erfassen, da Sie nichts ersetzen:sed -ri.bkp 's/2:\-?[0-9]*/2:0/g' input_file
Ich würde eine Basisschleife verwenden
awk
:Dies durchläuft alle Felder. Immer wenn einer von ihnen mit beginnt
2:
, ersetzt er alles durch2:0
. Schließlich1
steht das für True, so dass die gesamte Zeile gedruckt wird.quelle
Verwenden von
python
:Hier haben wir die
re.sub
Funktion desre
Moduls verwendet.re.sub()
hat das Mustersub(pattern, repl, string, count=0, flags=0)
Da wir die Werte innerhalb der Gruppe nicht weiter verwenden werden, haben wir die nicht erfassende Gruppennotation verwendet
(?:)
(?:(?<=(?: 2:))|(?<=(?:^2:)))
Verwendet den positiven Blick nach hinten mit der Breite Null, um2:
zu Beginn oder gefolgt von einem Leerzeichen übereinzustimmen.[^ ]*
Entspricht null oder mehr Zeichen vor dem Leerzeichen, danach2:
und ersetzt sie durch0
.Hier ist ein Beispiel:
Eingang:
Ausgabe:
quelle
Danke @kos für die
sed
Version:Einige kleine Modifikationen für den
perl
Weg:Schreiben Sie zurück mit:
Erläuterung:
Debuggex-Demo
1. Erfassungsgruppe
((^|\s)2:)
(^|\s)
1. Alternative:
^
^
Position am Anfang der Zeichenfolge bestätigen2. Alternative:
\s
\s
Entspricht einem beliebigen Leerzeichen[\r\n\t\f ]
2:
stimmt2:
buchstäblich mit den Zeichen überein[^\s]*
stimmen mit einem einzelnen Zeichen überein, das in der folgenden Liste nicht vorhanden istQuantifizierer:
*
Zwischen null und unbegrenzt, so oft wie möglich, nach Bedarf zurückgeben [gierig]\s
Entspricht einem beliebigen Leerzeichen[\r\n\t\f ]
Oder mit einem positiven Lookbehind , thx @steeldriver
Erläuterung
(?<=2:)
Positives Aussehen - Stellen Sie sicher, dass der unten stehende reguläre Ausdruck übereinstimmen kann2:
passt zu den Zeichen2
: buchstäblich\S*
Entspricht einem beliebigen Leerzeichen[^\r\n\t\f ]
Quantifizierer:
*
Zwischen null und unbegrenzt, so oft wie möglich, nach Bedarf zurückgeben [gierig]Debuggex-Demo
quelle
s/(?<=2:)\S*/0/g
(alle folgenden Folgen von Nicht-Leerzeichen ersetzen2:
durch0
)?S+
alsS*
eine leere Zeichenfolge zu ersetzen,2:
dh2:
wird2:0
, was möglicherweise nicht das beabsichtigte Verhalten ist