GNU/Linux >> Tutoriales Linux >  >> Linux

Reemplazo de una subcadena con otra cadena en Bash

Aquí está el escenario. Tiene una cadena grande y desea reemplazar parte de ella con otra cadena.

Por ejemplo, desea cambiar "Estoy escribiendo una línea hoy " a "Estoy escribiendo una línea ahora ".

En este tutorial rápido, le mostraré cómo reemplazar una subcadena de forma nativa en Bash. También mostraré el ejemplo del comando sed como una extensión.

Reemplazar subcadena de forma nativa en bash (bueno para una sola línea)

Bash tiene algunos métodos incorporados para la manipulación de cadenas. Si desea reemplazar parte de una cadena con otra, así es como lo hace:

${main_string/search_term/replace_term}

Cree una variable de cadena que consista en la línea:"Estoy escribiendo una línea hoy" sin las comillas y luego reemplace today con now :

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

¿Entendiste lo que acaba de pasar? En la sintaxis "${line/today/now}" , línea es el nombre de la variable donde acabo de almacenar la oración completa. Aquí, le estoy indicando que reemplace la primera ocurrencia de la palabra today con now . Entonces, en lugar de mostrar el contenido de la variable original, le mostró la línea con la palabra modificada.

Por lo tanto, la line la variable en realidad no ha cambiado. Sigue siendo lo mismo:

[email protected]:~$ echo $line
I am writing a line today

Pero definitivamente puede reemplazar la palabra que desee y modificar la misma variable para que los cambios sean permanentes:

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

Ahora los cambios se han hecho permanentes y así es como puede reemplazar permanentemente la primera aparición de una subcadena en una cadena.

También puede usar otras variables para almacenar subcadenas específicas que desea reemplazar:

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

Aquí, almacené la palabra a reemplazar en una variable llamada replace y la palabra por la que sería reemplazado dentro de replacewith . Después de eso, usé el mismo método que se discutió anteriormente para "revisar" la línea. Ahora, los cambios que había hecho al comienzo de este tutorial se han revertido.

Veamos otro ejemplo:

[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!

Reemplazar todas las ocurrencias de una subcadena

También puede reemplazar varias apariciones de subcadenas dentro de cadenas. Veámoslo a través de otro ejemplo:

[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

Ese / adicional después de hbday hizo que reemplace todas las apariciones de Many con So Many dentro de la oración.

Reemplazar cadena usando el comando sed (también puede funcionar en archivos)

Aquí hay otra forma de reemplazar subcadenas en una cadena en bash. Use el comando sed de esta manera:

Reemplazar primera ocurrencia:

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

Si tomo el primer ejemplo, se puede reproducir como:

También puede reemplazar todas las apariciones agregando g al final:

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

Ahora, puede pensar que esto es más complicado que el método nativo de cadena bash. Quizás, pero sed es muy poderoso y puede usarlo para reemplazar todas las apariciones de una cadena en un archivo.

sed -i 's/$replace/$replacewith/' filename

Aquí hay un ejemplo de algunos de los libros de Agatha Christie con 'Murder' en el título:

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

Voy a reemplazar Asesinato con Matrimonio porque algunas personas piensan que ambos son lo mismo:

sed -i "s/Murder/Marriage/g" agatha.txt

Y aquí está el archivo modificado ahora:

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sed es una herramienta muy poderosa para editar archivos de texto en Linux. Al menos deberías aprender sus conceptos básicos.

¿Disfrutaste leyendo este artículo? Si tiene algo que compartir sobre la sustitución de cadenas o este artículo, hágalo en los comentarios a continuación.


Linux
  1. ¿Cómo reemplazar una cadena con una cadena que contiene una barra oblicua con Sed?

  2. Bash -c con parámetros posicionales?

  3. Ejemplos de manipulación de cadenas Bash:longitud, subcadena, buscar y reemplazar

  4. bash - encuentra la posición del índice de cadena de la subcadena

  5. reemplazar líneas en un archivo con líneas en otro por número de línea

Reemplace du con polvo en Linux

Bash concatenar cadenas

Cómo verificar si una cadena contiene una subcadena en Bash

Sustitución de cadena en Bash

Bash Scripting – Manipulación de cadenas

Interfaces de usuario con diálogo. Script Bash (IV)