Esempio:
1:20 2:25 3:0.432 2:-17 10:12
Voglio sostituire tutte le stringhe che iniziano con 2:
a 2:0
.
Uscita:
1:20 2:0 3:0.432 2:0 10:12
Risposta accettata:
Usando sed
:
sed -E 's/((^| )2:)[^ ]*/\10/g' in > out
Inoltre, come ispirato dalla risposta di Souravc, se c'è non una possibilità di un 2:
sottostringa dopo l'inizio di una stringa non contenente un 2:
iniziale sottostringa (ad es. c'è non una possibilità di un 1:202:25
string, che il seguente comando abbreviato sostituirebbe in 1:202:0
), il comando potrebbe essere abbreviato in questo:
sed -E 's/2:[^ ]*/2:0/g' in > out
Comando n. 1 / n. 2 :
-E
:rendesed
interpreta il pattern come un pattern ERE (Extended Regular Expression);> out
:reindirizzastdout
perout
;
sed
ripartizione del comando n. 1 :
s
:afferma di eseguire una sostituzione/
:avvia il pattern(
:avvia il gruppo di acquisizione(
:inizia a raggruppare le stringhe consentite^
:corrisponde all'inizio della riga|
:separa la seconda stringa consentita:corrisponde a un
carattere
)
:interrompe il raggruppamento delle stringhe consentite2
:corrisponde a un2
carattere:
:corrisponde a un:
carattere)
:interrompe il gruppo di acquisizione[^ ]*
:corrisponde a qualsiasi numero di caratteri diverso da/
:interrompe il pattern / avvia la stringa di sostituzione\1
:backreference sostituito con il primo gruppo di acquisizione:aggiunge un
carattere
/
:interrompe la stringa di sostituzione / avvia i flag di patterng
:afferma di eseguire la sostituzione globalmente, cioè di sostituire ogni occorrenza del pattern nella riga
sed
ripartizione del comando n. 2 :
s
:afferma di eseguire una sostituzione/
:avvia il pattern2
:corrisponde a un2
carattere:
:corrisponde a un:
carattere[^ ]*
:corrisponde a qualsiasi numero di caratteri diverso da/
:interrompe il pattern / avvia la stringa di sostituzione2:0
:aggiunge un2:0
stringa/
:interrompe la stringa di sostituzione / avvia i flag di patterng
:afferma di eseguire la sostituzione globalmente, cioè di sostituire ogni occorrenza del pattern nella riga