Ecco lo scenario. Hai una stringa grande e vuoi sostituirne una parte con un'altra.
Ad esempio, vuoi cambiare "Sto scrivendo una riga oggi " a "Sto scrivendo una riga ora ".
In questo breve tutorial, ti mostrerò come sostituire una sottostringa in modo nativo in Bash. Mostrerò anche l'esempio del comando sed come estensione.
Sostituisci la sottostringa in modo nativo in bash (valido per una singola riga)
Bash ha alcuni metodi integrati per la manipolazione delle stringhe. Se vuoi sostituire parte di una stringa con un'altra, procedi così:
${main_string/search_term/replace_term}
Crea una variabile stringa composta dalla riga:"Sto scrivendo una riga oggi" senza le virgolette e quindi sostituisci today
con now
:
[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now
Hai capito cosa è appena successo? Nella sintassi "${line/today/now}"
, line è il nome della variabile in cui ho appena memorizzato l'intera frase. Qui, gli sto indicando di sostituire la prima occorrenza della parola today
con now
. Quindi, invece di visualizzare il contenuto della variabile originale, ti mostrava la riga con la parola modificata.
Quindi, la line
la variabile non è effettivamente cambiata. È sempre lo stesso:
[email protected]:~$ echo $line
I am writing a line today
Ma puoi sicuramente sostituire la parola che desideri e modificare la stessa variabile per rendere permanenti le modifiche:
[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now
Ora le modifiche sono state rese permanenti ed è così che puoi sostituire in modo permanente la prima occorrenza di una sottostringa in una stringa.
Puoi anche utilizzare altre variabili per memorizzare sottostringhe specifiche che desideri sostituire:
[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today
Qui ho memorizzato la parola da sostituire in una variabile chiamata replace
e la parola con cui verrebbe sostituita all'interno di replacewith
. Successivamente, ho usato lo stesso metodo discusso sopra per "rivedere" la linea. Ora, le modifiche che avevo apportato all'inizio di questo tutorial sono state ripristinate.
Vediamo un altro esempio:
[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!
Sostituzione di tutte le occorrenze di una sottostringa
Puoi anche sostituire più occorrenze di sottostringhe all'interno di stringhe. Vediamolo attraverso un altro esempio:
[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!
Quel /
in più dopo hbday
ha fatto sostituire tutte le occorrenze di Many
con So Many
all'interno della frase.
Sostituisci la stringa usando il comando sed (può funzionare anche sui file)
Ecco un altro modo per sostituire le sottostringhe in una stringa in bash. Usa il comando sed in questo modo:
Sostituisci la prima occorrenza:
line=$(sed "s/$replace/s//$replacewith/" <<< "$line")
Se prendo il primo esempio, può essere giocato come:
Puoi anche sostituire tutte le occorrenze aggiungendo g
alla fine:
line=$(sed "s/$replace/$replacewith/g" <<< "$line")
Ora, potresti pensare che questo sia più complicato del metodo della stringa bash nativo. Forse, ma sed è molto potente e puoi usarlo per sostituire tutte le occorrenze di una stringa in un file.
sed -i 's/$replace/$replacewith/' filename
Ecco un esempio di alcuni libri di Agatha Christie con "Murder" nel titolo:
[email protected]:~$ cat agatha.txt
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect
Sostituirò Omicidio con Matrimonio perché alcune persone pensano che entrambi siano uguali:
sed -i "s/Murder/Marriage/g" agatha.txt
Ed ecco il file modificato ora:
The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect
Sed è uno strumento molto potente per la modifica di file di testo in Linux. Dovresti almeno impararne le basi.
Ti è piaciuto leggere questo articolo? Se hai qualcosa da condividere sulla sostituzione delle stringhe o su questo articolo, fallo nei commenti qui sotto.