Is it a fake website?

19 enero 2008

sed - Mes de las herramientas unix; semana 2

Introducción
Sed parece ser una de esas herramientas que provoca miedo en la gente. Muchos ni que decir tiene que ya lo conoceis, ¿pero es útil para vosotros?, ¿la conoceis realmente?
En este mes de las herramientas unix pretendo concentrar gran información práctica. Para saber más sobre las herramientas con las que practicaremos podreis consultar sus man pages.

tabla de contenidos.
¿Qué es sed?
Invocación y uso básico
¿Funciones y Síntaxis
¿Qué es una dirección?
¿Qué son funciones?
¿Qué puedo hacer con sed?
Muestra todo excepto la primera línea
Imprime las líneas sin comentarios de squid.conf
De un archivo con múltitud de líneas en blanco, déjalo todo a doble espacio.
Inserta una línea en blanco por cada línea que coincida con regex.
Convierte los saltos de línea de DOS (CR/LF) al formato unix.
Substituye foo con bar en cada línea
Imprimer la sección de archivo entre dos expresiones regulares. (inlcusive)



¿Qué es sed?

Sed viene de "Stream Editor", esto es, "editor de flujos". Básicamente nos permite realizar múltiples manipulaciones a los flujos de texto.

Invocación y uso básico

#sed [-rn] [-e 'sedscript'] [file1 file2 ...]

-r para utilizar regex extendido, -n para que no muestre nada por la salida por defecto, -e creo que no hará falta explicarlo. Consultar las páginas de manual para más información.

Sed es básicamente un lenguaje de procesamiento de textos. Aunque contiene una gramática muy limitada, sed es muy potente. La instrucción que seguro nos sonará de perl s/foo/bar viene de sed. Algunos ejemplos.

Reemplazamiento simple de texto.
#echo "Hola a todos" | sed -e 's/todos/logadmin/'
Hola a logadmin

Característica similar a grep.
#sed -ne '/Ubuntu/p' /etc/motd
The programs included with the Ubuntu system are free software;
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by


Funciones y Síntaxis.

La síntaxis de sed es muy simple. Una expresión general sera así:
address[,address]function

Las expresiones están separadas por nuevas líneas o punto y coma.


¿Qué es una dirección?

Una dirección es una manera de indicar un lugar en tu flujo de datos. Una dirección poría ser:
  • Un número de línea (ej. 1). La primera línea es '1'
  • Una expresión que coincide con una expresión regualar, como /foo/
  • El carácter $ que coincide con la última línea del fichero.
  • Nada, lo que significará 'cada línea del archivo'

¿Qué son funciones?

Las funciones en sed son siempre con una letra. Las más usuales:
  • p (print -imprime-)
  • s (substitute -sustitye-)
  • d (delete -borra-)
  • x (intercambia el patrón y manten el buffer)
  • h y H (copia y añade al buffer mantenido)
  • ! (aplica la próxima función contra las líneas que no coincidan)

¿Qué puedo hacer con sed?

Muestra la primera línea de entrada (igual que head -n 1)
#sed -ne 1p archivo

Muestra todo excepto la primera línea

#sed -ne '1!p' archivo

Imprime las líneas sin comentarios de squid.conf

#sed -ne '/^[^# ]/{p;q;}' squid.conf

De un archivo con múltitud de líneas en blanco, déjalo todo a doble espacio.

#sed '/^$/d;G' antes.txt > despues.txt

Inserta una línea en blanco por cada línea que coincida con regex.

#sed '/regex/{x;p;x;}' antes.txt > despues.txt

Convierte los saltos de línea de DOS (CR/LF) al formato unix.

#sed 's/^M$//' <> despues.txt # para poner en bash ^M pulsa Ctrl-V y Ctrl-M

Substituye foo con bar en cada línea

#sed 's/foo/bar/' <> outfile # reemplaza sólo la primera instancia de una línea
#sed 's/foo/bar/4' <> outfile # reemplaza las 4 primeras instancias de una línea
#sed 's/foo/bar/g' <> outfile # reemplaza todas las instancias de una línea.

Imprimer la sección de archivo entre dos expresiones regulares. (inlcusive)

#sed -n '/regex1/,/regex1/p' <> archivo_nuevo.txt

No hay comentarios: