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.