sed

(Stream Editor)

Parte I

Sin duda, muchas veces usted necesitará administrar información contenida en archivos de texto de manera rápida y efectiva, es decir, usted puede usar un editor de texto para modificar archivos, pero ¿qué pasa si debe de hacer lo mismo para diez, veinte o mil de esos archivos?

Para eso existe el comando "sed", que es el nombre del editor no interactivo, que permite editar archivos de texto desde la línea de comandos, cosa que resulta muy práctica, como supondrá, aunque aprenderlo puede parecer muy complicado al principio, sobre todo si usted viene del "mundo de micro$oft".

En mi caso prefiero sed porque facilita el trabajo con archivos de texto, más que crear una subrutina en Perl.

Como la sintaxis de esta aplicación es un poco extensa, voy a enfocarme en mostrarle algunos ejemplos del uso común. Tenga en cuenta que en la sintaxis de sed se utilizan comillas simples cuando el patrón a operar incluye caracteres especiales, al igual que grep.



Ejemplo #1:

Suponga que debe cambiar la palabra "Pedro" por "Pablo" dentro de un documento.

sed s/Pedro/Pablo/g documento.txt > salida.txt

Se usa sed para llamar la aplicación, dejamos un espacio y colocamos la instrucción:

s/Pedro/Pablo/g que explicaré con más detalle:

La "s" significa "substitulla".

"/Pedro/Pablo/" son los patrones a buscar y reemplazar, respectivamente.

Luego la "g" significa que la acción se realizará en todo el documento; si esta letra no estuviera la acción se realizaría en la primera aparición de la palabra "Pedro" únicamente.

"documento.txt" representa el documento al que se aplicarán los cambios y

"> salida.txt" es el archivo donde se guardarán los cambios.



Ejemplo #2:

Quiero realizar un reemplazo de la palabra "Pedro" por "Pablo"dentro de un documento, pero solo a las líneas que contengan la palabra "Sr."

sed /Sr/s/Pedro/Pablo/ documento.txt > salida.txt

Solo piense en la construcción de la instrucción y saque conclusiones.

Ahora hagamos algo más complicado: Una operación doble, como la substitución de dos patrones diferentes.

sed 's/Pedro/Pablo/;s/Juan/Mateo/' documento.txt > salida.txt



Para hacer el trabajo de sustitución a las líneas que contengan la palabra "Sr" y "Srs":

sed /Sr/,/Srs/s/Pedro/Pablo/ documento.txt > salida.txt

Esto aplica también si quisieramos poner una expresión regular como esta:

sed '/Sr.*/s/Pedro/Pablo/' documento.txt > salida.txt

Si no se colocan las comillas sencillas en el comando, sed interpreta erróeamente los caracteres especiales usados en las expresiones regulares.

Ejemplo #3:

Si quisiera que la acción de reemplazo o sustitución se aplicara al rango de líneas entre la 5 y la 16, exclusivamente.

sed 5,16s/Pedro/Pablo/ documento.txt > salida.txt

sed 5,16s/Pedro/Pablo/g documento.txt > salida.txt

Observe que no hay espacios en blanco entre los parámetros "5,16s"

También puedo explicar que la sustitución se haga solo en la primera línea.

sed 1s/Pedro/Pablo/ documento.txt > salida.txt

O si quiero ejecutar ese proceso en la última línea.

sed '$s/Pedro/Pablo/' documento.txt > salida.txt

Ejemplo #4:

Si quisiera el caso contrario al anterior, es decir aplicar la acción de sustitución a todo el documento, excepto a las líneas que van de la 5 a la 16.

sed '5,16!s/Pedro/Pablo/' documento.txt > salida.txt

Preste atención al signo de admiración (!).



Ahora que somos expertos en instrucciones de reemplazo, les voy a mostrar otros usos de sed.



Ejemplo #5:

Para mostrar una tercera línea de un archivo se puede usar la instrucción:

sed -n '3p' documento.txt > salida.txt

La opción -n hace que solo se muestren las líneas que interesan y no todo el documento.

Y para mostrar el rango de líneas de la tercera a la vigésima:

sed -n '3,20p' documento.txt > salida.txt

También se puede usar el carácter "$" para indicar el final del archivo, o la última línea del mismo:

sed -n '3,$p' documento.txt > salida.txt

Ejemplo #6:

Para ver todas las líneas de un archivo, excepto las que contengan la palabra "algo":

sed '/algo/d' documento.txt

La opción "d" significa "delete", o borrar en inglés.

Ejemplo #7:

En el caso opuesto, o sea, que queramos ver solo las líneas que contengan la palabra "algo":

sed '/algo/!d' documento.txt

Borrar un rango de líneas:

sed '1,10d' documento.txt > salida.txt

Borrar la última línea:

sed '$d' documento.txt > salida.txt

Borrar líneas en blanco:

sed '/^$/d' documento.txt > salida.txt

Ejemplo #8:

Agregar una línea en de texto en la en la línea 4 del archivo documento.txt

sed -e '4a\

Esta línea se agrega al texto' documento.txt > salida.txt

Ejemplo #9:

La opción "-e" significa "ejecute". Hasta ahora casi no la he usado esa opción explicitamente , porque se asume. Se pueden usar varios comandos en línea de la siguiente forma:

sed -e 'comando 1' -e 'comando 2' archivo.txt > archivo2.txt

O puede usar el modo ya conocido:

sed 'comando1 ; comando 2' archivo.txt > archivo2.txt





Notas finales:

Una última nota: NUNCA trate de redireccionar la la salida del comando sed hacia el mismo archivo de donde esta obteniendo la entrada.

sed -e 'comando' archivo.txt > archivo.txt

Esto no resulta, pero puede hacer esto otro:

sed -e 'comando' archivo.txt > temp.txt; cat temp > archivo.txt

Variables de sed:

Lo último que quisiera explicarle, es el uso de variables dentro de sed. No me refiero a las variables del shell, sino a unas variables especiales2 que contempla el comando sed, por sí mismo.

Verá, resulta que en sed podemos encerrar un patrón o cadena de caracteres dentro de esta instrucción: "\(patrón\)" para luego llamarla como "\1".

Ejemplo:

sed -e "s/\(set\)/\1env/g" documento.txt > salida.txt

En este ejemplo el patron "set" se encuentra entre "\(" y "\)", de manera que este se almacena en la variable "\1" que luego es solicitada en el patrón de sustitución. Dicho de otra forma el ejemplo anterio se traduce como:

sed -e "s/set/setenv/g" documento.txt > salida.txt

También existe un símbolo que repite el patrón a buscar dentro del patrón de reemplazo, se denomina como "&".

sed -e "s/angel/&-&/g" documento.txt > salida.txt

Esta instrucción toma todas las palabras "angel" dentro del documento y las reemplaza por "angel-angel".

Ahora solo le recomiendo que explore usted mismo otras opciones, ¡y que tenga éxito!


Anibal G. [email protected]