miércoles, 26 de febrero de 2014

Comando sed multiusos (mostrar, sustituir)

Les comparto esta información acerca de el uso del comando "sed", que puede servir tanto para mostrar información de archivos , como para sustituir cadenas de texto en los mismos.


MOSTRANDO SALIDA ESTANDAR

sed -e 'd' archivo.txt
Este comando no edita el archivo, solo muestra el contenido del mismo eliminando la primer linea de la salida estandard

sed -e '1,10d' /etc/services | more
Es parecido al anterior solo que ahora es con rangos, y elimina de la salida estandard de la linea 1 a la 10

sed -e '/^#/d' /etc/services | more
Elimina de la salida todas las lineas que empiezan con el caracter '#'

Expresiones regulares:
^ Apunta al comienzo de la línea
$ Apunta al final de la línea
. Apunta a un único carácter
* Apunta a cero o más ocurrencias del carácter previo
[ ] Apunta a todos los caracteres entre los corchetes


Ejemplos con expresiones regulares:

/./ Apuntará a cualquier línea que contenga al menos un carácter
/../ Apuntará a cualquier línea que contenga al menos dos caracteres
/^#/ Apuntará a cualquier línea que comience con un '#'
/^$/ Apuntará a cualquier línea en blanco
/}$/ Apuntará a toda línea que termine con un '}' (sin espacios)
/} *$/ Apuntará a toda línea que termine con un '}' con cero o más espacios
/[abc]/ Apuntará a toda línea que contenga una 'a', 'b', o 'c' minúscula
/^[abc]/ Apuntará a cualquier línea que empiece con 'a', 'b', o 'c'



sed -e '/expreg/d' /ruta/a/mi/archivo/de/pruebas | more
Elimina de la salida que coincidan con la expresion

sed -n -e '/PRINCIPIO/,/FIN/p' /mi/archivo/de/pruebas | more
Muestra un bloque de texto que comienza con la linea que contiene "PINCIPIO"  y terminará con la linea que contiene "FIN"


SUSTITUCIÓN EN ARCHIVOS

sed -e 's/foo/bar/' miarchivo.txt
Sustituye dentro de miarchivo.txt  la primer coincidencia de foo por la cadena bar

sed -e 's/foo/bar/g' miarchivo.txt
La opción "g" indica que la sustitución será de manera global en el archivo

sed -e '1,10s/enchantment/entrapment/g' miarchivo2.txt
Sustituye la palabra enchantment por entrapment pero solo hasta la linea 10 del archivo

sed -e '/^$/,/^FIN/s/colinas/montañas/g' miarchivo3.txt
Sustituye 'colinas' por 'montañas', pero únicamente en los bloques de texto que comiencen con una línea en blanco, y que terminen con una línea que comience con los tres caracteres 'FIN'

sed -e 's:/usr/local:/usr:g' milista.txt
cambia /usr/local por /usr:

sed -e 's/<[^>]*>//g' miarchivo.html
Elimina etiquetas html. El '[^>]' especifica un "carácter que no sea '>'" y el '*' después del mismo completa la expresión para significar "cero o más caracteres que no sean '>'"

Clases de caracteres

Clase de carácter Descripción
[:alnum:] Alfanumérico [a-z A-Z 0-9]
[:alpha:] Alfabético [a-z A-Z]
[:blank:] Espacios o tabuladores
[:cntrl:] Cualquier carácter de control
[:digit:] Dígitos numéricos [0-9]
[:graph:] Cualquier carácter visible (no espacios en blanco)
[:lower:] Minúsculas [a-z]
[:print:] Caracteres que no sean de control
[:punct:] Caracteres de puntuación
[:space:] Espacio en blanco
[:upper:] Mayúsculas [A-Z]
[:xdigit:] Dígitos hexadecimales [0-9 a-f A-F]


sed -e 's/.*/Rafa dijo: &/' msjorig.txt
El siguiente ejemplo pondrá el prefijo "Rafa dijo: " a cada frase/linea


Y pues siguiendo con este howto les dejo este script que acabo de ocupar para sustituir una dirección web de todos los archivos html de un directorio y hace un backup de los archivos modificados por si necesitas restaurar.

#!/bin/bash
echo "";echo ""; echo ""
echo "Sustituyendo  http://beta.fd.uach.mx"
echo "en todos los directorios y subdirectorios de: $1"

find $1 -iname *.html > tmp
while read linea
do 
 sed 's/http:\/\/beta.fd.uach.mx//g' $linea > $linea.tmp
 cp $linea $linea.bak
 cat $linea.tmp > $linea
 rm $linea.tmp
done < tmp
rm tmp


El modo de uso de este script es:

./script.sh /directorio/de/mis/html




No hay comentarios: