viernes, 27 de marzo de 2009

Buscar y sustituir palabras en muchos archivos

Después de empezar a usar find para borrar los archivos, me estoy aficionando a usarlo y he encontrado una utilidad que quiero compartir. Además, la sintaxis es delicada y puede que tenga que echar mano de esto que escribo para recordarla.

El problema que tenía es: dados unos archivos que se llamen parecido... pongamos "grid.vtk"; queremos sustituír una o varias palabras en todos ellos, en mi caso "scalars" por "power_density". Estoy seguro que hay un montón de aplicaciones "de ventanas con botones" que lo pueden hacer, pero también estoy seguro de que se tarda más usándolas. Así que repetid conmigo: La bash es nuestra amiga, la bash es nuestra amiga...

Al grano, abrimos una bash, nos situamos en el directorio del que cuelgan todos los subdirectorios que contienen los archivos que queremos modificar y lanzamos:

find -iname grid.vtk -exec sed -i 's/scalars/Power_density/g' {} \;

Ahora la explicación:

-iname es el nombre de los archivos que queremos cambiar. Acepta comodines. En este caso son todos aquellos que se llamen grid.vtk.
-exec le dice a find que ejecute este comando en cada uno de los archivos:
sed -i 's/scalars/Power_density/g' {} \;
donde:
-i le dice a sed que edite el archivo
s es la opción de sustitución, en este caso busca scalars y lo sustituye por Power_density
g es la opción para que lo haga para todas las coincidencias en el archivo
{} el la ruta al archivo que ha encontrado find, y
\; es el final del comando find, que tendrá algún sentido pero lo desconozco, lo uso como una receta.

Como veréis, la sintaxis de sed se parece mucho a vim, así que aprendemos 2x1.

1 comentario:

Anónimo dijo...

Muchas gracias, me ha sido muy util