GNU/Linux >> Linux Esercitazione >  >> Linux

Sostituzione di una sottostringa con un'altra stringa in Bash

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.


Linux
  1. Come verificare se la stringa contiene una sottostringa in Bash

  2. Esempi di manipolazione di stringhe Bash:lunghezza, sottostringa, trova e sostituisci

  3. Come scrivere più stringhe di righe usando Bash con variabili?

  4. Sostituisci una parola con un'altra in bash

  5. Bash:aspetta con timeout

Sostituisci du con polvere su Linux

Bash concatena le stringhe

Come verificare se una stringa contiene una sottostringa in Bash

Sostituzione di String in Bash

Bash Scripting – Manipolazione di stringhe

Interfacce utente con finestra di dialogo. Scripting Bash(IV)