Reemplazar cadenas en archivos con sed

sed es un “editor de textos” para el filtrado y la transformación de textos. Escribo “editor de texto” entre comillas pues en realidad sed no trabaja con cadenas de caracteres sino con “flujos”, la diferencia con los editores de textos clásicos (interactivos) es que sed acepta como entrada estándar un archivo o cualquier otro stream; resultado que es procesado y devuelto a la salida estándar (vea más acerca de stdin, stdout y stderr aquí)

Veamos un ejemplo muy sencillito:

[CODE]
$ cat saludo.txt
hola
maldito
mundo
[/CODE]

[CODE]
$ sed ‘2d’ saludo.txt
hola
mundo
[/CODE]

No hace mucha explicación ¿no?, el comando d recibe el número de línea a eliminar. Esto es muy sencillo y es el ejemplo más básico del uso de sed; simplemente para que te vayas amigando.

Ahora veamos un ejemplo similar, pero reemplazando palabras:

[CODE]
$ sed ‘s/maldito/bendito/’ saludo.txt
hola
bendito
mundo
[/CODE]

Ahora usamos el comando s, éste recibe una cadena a buscar y una cadena por la que se reemplazarán las coincidencias en todos sus archivos.

Finalmente, para cerrar esta breve introducción a sed veamos un ejemplito propuesto en Feelinfo ¿Cómo reemplazar textos en varios archivos en Linux?:

Sabiendo que “sed -i ‘/s/palabra-vieja/palabra-nueva/g’ *.txt” reemplaza todas las ocurrencias de la palabra vieja por palabra nueva en todos los archivos:

[CODE]
sed -i ‘s/Pepe/Jose/g’ *.txt
sed -i ‘s/Manolo/Manuel/g’ *.txt
sed -i ‘s/Nacho/Ignacio/g’ *.txt
sed -i ‘s/Inma/Inmaculada/g’ *.txt
[/CODE]

Bien, esto es todo por ahora. Una observación para mi como para ustedes, no nos creamos que sed se limita a solo esto… manipulando flujos podemos dominar el mundo 😛 (¿no me crees? mira este rudimentario tetris escrito con sed, sedtris.sed)

Tags: , , , , , , ,


  • Felinfo

    Hola Luciano.

    Gracias por referenciar a mi blog. Yo soy seguidor del tuyo desde hace mucho tiempo.

    Saludos!

    Reply

  • Fede

    Bueno asi con palabras normales todo muuy bien, pero que tal si uno quiere reemplazar texto en el cual vienen simbolos como por ejemplo una diagonal (/) o simbolos como el mayor que y el menor que () como puedo hacer para que el sed no tome las diagonales en un texto como si fueran parte de su comando y las tome como parte del texto a reemplazar, por ejemplo, quiero reemplazar la cadena de texto siguiente:

    Vivimos en/ sociedad

    por el texto

    EEEEEEEEEEEE

    segun yo el comando seria asi:

    sed ‘s/Vivimos en/ /EEEEEEEEEEEEEEEEE/’ texto1

    pero me devuelve el error:

    sed: -e expresión #1, caracter 21: unknown option to `s’

    y si lo pongo asi:

    sed -e ‘s/Vivimos en/ /EEEEEEEEEEEEEEEEE/’ texto1

    Me saca lo mismo, ayuda por favor

    Reply

    • Lucho

      Es tardisimo para responder esto, pero si alguien más lo necesita puede ser útil… Para que sed interprete lo que queremos basta con “escapar” la barra con una contrabarra adelante de esta. De esta manera sed interpreta que ESA BARRA no es parte de su sintaxis… Por ejemplo:
      echo “Vivimos en/” | sed ‘s/Vivimos en//EEEEEEEEEEEEEEEEE/’

      Reply

  • Chorra

    Pues yo creo que es mejor Reemplazar cadenas en archivos despues de haber bebido lo suficiente…

    Reply

  • inukaze

    Hola muy buenas , yo quiero saber como tendria que hacer para poder reemplazar en el archivo

    /usr/share/applications/defaults.list

    la linea que dice

    inode/directory=nautilus.desktop

    por

    inode/directory=file-manager.desktop

    estoy haciendo un script , pero no encuentro el modo de hacer esto

    Reply

  • guillermo

    Hola que tal tengo dudas con una aplicación de sed en text con la siguiente forma

    14DICHLORBENZDEG-PWY CHLOROMALERED-RXN 0 0 0 0 0 0 0 0 0 0 0 0
    DI-CLORO-PWY CHLOROMALERED-RXN 0 0 0 0 0 0 0 0 0 0 0 0
    DOMIN-PWY MAXTON-RXN 0 0 0 0 0 0 0 0 0 0 0 0

    Ahora lo que quiero hacer es que por ejemplo para “CHLOROMALERED-RXN” si cualquier fila lo tiene agregue al final de esa linea un \t1

    Debiendo quedar en el mismo archivo esto:

    14DICHLORBENZDEG-PWY CHLOROMALERED-RXN 0 0 0 0 0 0 0 0 0 0 0 0 1
    DI-CLORO-PWY CHLOROMALERED-RXN 0 0 0 0 0 0 0 0 0 0 0 0 1
    DOMIN-PWY MAXTON-RXN 0 0 0 0 0 0 0 0 0 0 0 0

    pero no se bien cual sería el comando sed necesario para hacer eso, eventualmente despues debería ir tomando cada valor de la segundo columna, vale decir chequear todo el archivo buscando “MAXTON-RXN” y si lo encuentra poner un \t1 (\t -> tabulación, no el texto)

    Si alguien sabe como se lo agradecería mucho, ya que me encuentro atascado en ese paso

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.