PDA

Ver la Versión Completa : Sustituir contenido de un fichero desde la terminal



Xripox
07/02/2011, 15:19
[Only registered and activated users can see links]

Suele ser habitual encontrar en las explicaciones de Internet la necesidad de sustituir algún dato en un fichero de texto obligando para ello al usuario a localizar el archivo, hacer una búsqueda en su contenido y hacer el cambio pedido sin equivocarse en ninguno de los pasos.

No es una tarea excesivamente complicada pero si que puede resultar aburrida, innecesaria y propensa a errores.

Texto de ejemplo
Sea el contenido del fichero /tmp/frases.txt, que usaremos en nuestros ejemplos, el siguiente


Francisco compra el Pan
Odio que me despierte el panadero
Compra pan cuando estés acampando
Tengo congelado algo de pan de la semana pasada

Veamos qué podemos hacer con él

Buscar y reemplazar un texto

Sustituir texto

Si lanzamos desde la terminal un


sed 's/pan/XXXX/g' /tmp/frases.txt

obtendremos como resultado


Francisco compra el Pan
Odio que me despierte el XXXXadero
Compra XXXX cuando estés acamXXXXdo
Tengo congelado algo de XXXX de la semana pasada


Ignorar mayúsculas y minúsculas

En la primera frase se nos ha escapado Pan para evitarlo debemos lanzar el comando sed del siguiente modo


sed 's/pan/XXXX/gi' /tmp/frases.txt

NOTA: Observa el /gi al final del patrón

obtendremos como resultado


Francisco compra el XXXX
Odio que me despierte el XXXXadero
Compra XXXX cuando estés acamXXXXando
Tengo congelado algo de XXXX de la semana pasada


Sustituir palabras completas

En los ejemplos anteriores encontramos que se han producido sustituciones de texto en palabras como panadero y acampando. Para evitarlo utilizaremos /b del siguiente modo


sed 's/pan\b/XXXX/gi' /tmp/frases.txt

obteniendo como resultado


Francisco compra el XXXX
Odio que me despierte el panadero
Compra XXXX cuando estés acampando
Tengo congelado algo de XXXX de la semana pasada


Líneas de inicio y fin

Si queremos que sólo se cambie el texto comprendido entre dos líneas del fichero (ambas incluidas) deberemos recurrir al siguiente comando


sed '2,3s/pan/XXXX/gi' /tmp/frases.txt

NOTA: observa el 2,3 que indica que los cambios deben realizarse en las líneas 2 y 3 dejando inalteradas el resto.

NOTA: observa igualmente que he quitado el /b para que sustituya cualquier ocurrencia de pan sin tener en cuenta si es, o no, una palabra completa o está dentro de otra; de este modo conseguimos que se vean cambios en ambas líneas.

El resultado del comando anterior sería


Francisco compra el Pan
Odio que me despierte el XXXXadero
Compra XXXX cuando estés acamXXXXdo
Tengo congelado algo de pan de la semana pasada


De una línea hasta el final

Si queremos cambiar todas las ocurrencias desde una línea concreta hasta el final, lanzaremos el comando del siguiente modo


sed '2,$ s/pan/XXXX/gi' /tmp/frases.txt

observando que se ha utilizado $ en lugar del número de línea final para indicar que debe llegar hasta el final del fichero.

El resultado sería


Francisco compra el Pan
Odio que me despierte el XXXXadero
Compra XXXX cuando estés acamXXXXdo
Tengo congelado algo de XXXX de la semana pasada



Visto en Informático de guardia ([Only registered and activated users can see links])