miércoles, 22 de agosto de 2012

Comando sed


Reemplazar cadenas en archivos con sed



sed, sustitución y eliminación de patrones

El programa sed puede realizar sustituciones y eliminación de patrones de texto utilizando expresiones regulares, como lo que utilizamos con el comando grep.



Comandos del Editor
a\ Append text below current line.
c\ Change text in the current line with new text.
d Delete text.
i\ Insert text above current line.
p Print text.
r Read a file.
s Search and replace text.
w Write to a file.

Presentar el archivo example
bash$ cat -n example
1 Esto es la primera línea de este un texto de ejemplo.
2 Es un texto con erores.
3 Muchos erores.
4 Tantos erores, que con todos los erores estoy poniendo enfermo!
5 Este línea no contiene errores.
6 Este por fin es la ultima línea.

El archivo contienen palabras mal escrita eror, erores 

Imprimir líneas que contiene un patrón
bash$ sed -n '/erores/p' example
La salida será solo las líneas que tengan el patrón “erores”
Es un texto con erores.
Muchos erores.
Tantos erores, que con todos los erores estoy poniendo enfermo!

Borrando líneas de entrada que contiene un patrón:
bash$ sed '/erores/d' example                  <<== El comando d excluye las líneas en la salida
Esto es la primera línea de este un texto de ejemplo.
Este línea no contiene errores.
Este por fin es la ultima línea.

Utilizando expresiones regulares, podemos buscar líneas que comienza con un patrón en particular y terminando con otra patrón:
bash$ sed -n '/^Esto.*errores.$/p' example
Este línea no contiene errores.

Rangos de líneas
Quitar líneas
bash$ sed '2,4d' example
Esto es la primera línea de este un texto de ejemplo.
Este línea no contiene errores.
Este por fin es la ultima línea.

Quitar todas las línea de la 3 a hasta el final del archivo
Bash$ sed '3,$d' example
Esto es la primera línea de este un texto de ejemplo.
Es un texto con erores.

Rangos
Imprime la primera línea que contiene el patrón "un texto", hasta e incluyendo la siguiente línea que contiene el patrón “Este”
bash$ sed -n '/un texto/,/Este/p' example
Es un texto con erores.
Muchos erores.
Tantos erores, que con todos los erores estoy poniendo enfermo!
Estelínea no contiene errores.

Buscar y sustituir con sed
En el fichero de ejemplo, ahora vamos a buscar 'erores' y sustituir por 'errores'
bash$ sed 's/erores/errores/' example
Esto es la primera línea de este un texto de ejemplo.
Es un texto con errores.
Muchos errores.
Tantos errores, que con todos los erores estoy poniendo enfermo!
Este línea no contiene errores.
Este por fin es la ultima línea.

Sustitución global
Aún hay una problema: in línea 4, solo la primer ocurrencia del patrón esta sustituido (El primero esta cambiado, pero el segundo no).
Utilice el comando con g para indicar a sed que debe examinar todos los ocurrencias del patrón y no para con la primera en cada línea.
bash$ sed 's/erors/errors/g' example
Esto es la primera línea de este un texto de ejemplo.
Es un texto con errores.
Muchos errores.
Tantos errores, que con todos los errores estoy poniendo enfermo!
Este línea no contiene errores.
Este por fin es la ultima línea.

Otro Ejemplo
$ cat saludo.txt
hola
maldito
mundo

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

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:

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

Inserción
Para insertar una cadena utilice el s
Ejemplo: insertar un carácter (>) al principio de cada línea en el texto: (Combinar con expresiones regulares)
bash$ sed 's/^/> /' example
> Esto es la primera línea de este un texto de ejemplo.
> Es un texto con erores.
> Muchos erores.
> Tantos erores, que con todos los erores estoy poniendo enfermo!
> Este línea no contiene errores.
> Este por fin es la ultima línea.

Ejemplo: Insertar una cadena (EOL) al final de cada línea:
bash$ sed 's/$/EOL/' example
Esto es la primera línea de este un texto de ejemplo.EOL
Es un texto con erores.EOL
Muchos erores.EOL
Tantos erores, que con todos los erores estoy poniendo enfermo! EOL
Este línea no contiene errores.EOL
Este por fin es la ultima lineaEOL

Múltiples sustituciones
Múltiplesbúsqueda y sustituciones están separada con la opción ­e individualmente:
bash$ sed -e 's/erors/errors/g' -e 's/ultima/final/g' example
Esto es la primera línea de este un texto de ejemplo.
Es un texto con errores.
Muchos errores.
Tantos errores, que con todos los errores estoy poniendo enfermo!
Este línea no contiene errores.
Este por fin es la final línea.

Por defecto, sed imprime su resultado al standard output (impresión en pantalla), Utilice redirección para almacenar la salida a un fichero:
sed opción 'expresión' fichero_leer > fichero_salida

Existe muchas ejemplos de sed en los scripts de inicialización de Linux.
– En directorios /etc/init.d ó /etc/rc.d/init.d.
– Par verlos: grep sed *

Sed no-interactivo (scripts)
Se puede leer los comandos de sed desde un fichero con la opción ­f, Se puede guardar múltiples comandos de sed en un fichero. Se debe tener en cuenta la siguiente:
  • No se puede tener espacios en blanco al principio ni al final
  • Cuotaciones no están permitidos.
  • Cuando introduciendo texto para añadir o sustituir, todoexcepto la últimalínea termina con un backslash.

Escribiendo ficheros. En este ejemplo, utilizamos sed para escribir un fichero sencillo de html
bash$ cat script.sed      
1i\
<html>\
<head>\
<title>sed generatedhtml</title>\
</head>\
<body bgcolor="#ffffff">\
<pre>$a\
</pre>\
</body>\
</html>
El programa sed es estupendo para hacer sustituciones automáticas en texto. Un uso muy simple sería:

Cambia la cadena "tomate" por "pera" en el texto a.txt y lo guarda en b.txt, si no lo redireccionamos a otro archivo el cambio no tendrá efecto
# sed s/tomate/pera/g a.txt > b.txt

En este ejemplo "&" es un comodín, pero hay que poner antes \ (escape) para que bash no lo intente interpretar.
sed  s/solo/\&mente/g  (cambia "solo" por "solamente")

Borrará la tercera línea del archivo
$ sed '3d' archivo

Substituye el carácter e por # en las líneas del 2 a la 4 inclusive.
$ sed '2,4s/e/#/' fichero

Cambia todas las minúsculas a mayúsculas de archivo.
sed '1,$ s/[a-z]/[A-Z]/g' archivo

Añade una línea con el contenido "Línea insertada" después de cada línea del archivo.
sed 'a\Línea insertada' archivo

Cambiar, en el fichero /home/pepito/.profile , la expresión TERM=vt100 por TERM=vt220
sed s/TERM=vt100/TERM=vt220/g /home/pepito/.profile >/tmp/j && mv /tmp/j /home/pepito/.profile

2 comentarios:

  1. Me gustaría saber como sustituir todas las palabras que empiecen por 't' (lo que sea) por 'caracola' (por ejemplo).

    ResponderEliminar
  2. sed 's/\<t/cocacola/' fichero

    ResponderEliminar

Especialistas en sistemas Operativos Linux

Sistematizan a empresas Sistematización a empresas, Agilidad, Seguridad y confianza