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
Me gustaría saber como sustituir todas las palabras que empiecen por 't' (lo que sea) por 'caracola' (por ejemplo).
ResponderEliminarsed 's/\<t/cocacola/' fichero
ResponderEliminar