Con la sana intención de retomar mi blog voy a comenzar a publicar cualquier cosa que me resulte útil en el día a día. Por ejemplo esta que acabo de utilizar.
Necesitaba modificar un texto que estaba en catorce ficheros dispersos por la geografía de mi disco duro.
Lo primero, localizar dichos ficheros y pasárselos a vim:
grep -r 'el texto buscado' -l . | xargs vim
Una vez en vim, reemplazo el texto en todos los ficheros:
bufdo! 1,$s/el texto buscado/el texto deseado/gc
La "c" final es para que nos pida confirmación antes de reemplazar, si lo tenemos claro la podemos quitar.
Por último, para revisar los cambios en cada fichero antes de guardarlos repetimos la siguiente secuencia para cada uno de ellos:
:wn + enter + enter
Si por el contrario queremos guardar todos los ficheros de golpe sin revisarlos:
:wa
O :xa si queremos guardarlos y salir de vim. Ahora bien, tal y como comenta Porras más abajo, si desde el principio tenemos claro lo que queremos reemplazar y no nos preocupa revisar directamente con el editor las sustituciones, podemos utilizar sed desde la línea de comandos:
grep -r 'el texto buscado' -l . | xargs sed -i 's/el texto buscado/el texto deseado/g'
Para terminar, no sé muy bien por qué motivo pierdo el eco de la terminal siempre que le paso a vim los ficheros que debe abrir por medio de xargs. Para resolverlo simplemente escribo con fe, por que no lo veo, lo siguiente:
reset + enter
Y todo vuelve a estar como al principio pero, eso sí, con "el texto deseado".
Créditos:
- el xargs me lo enseñó Javier Picado
- el bufdo me lo presentó Daniel Blanco
- el reset se lo vi a Blat
- el sed y la opción -l de grep me lo comentó Porras
¡Gracias majos!

3 comentarios
hey nando!
pues esto está guay para cuando quieres ir viendo lo que hace y que te pida confirmación, pero si de verdad lo tienes claro (o tienes los archivos bajo control de versiones de forma que puedas deshacer si la cagas) tardas menos con sed (y no me refiero a si lo haces sin beber :P):
grep -r Wadus -l .| xargs sed -i "" "s/Wadus/Jander/"
feliz navidad!!
Muy guapo Porras!
Para empezar el grep con la opción -r para que busque recursivamente es mucho mas universal que el rgrep que me he acostumbrado a utilizar en Debian.
Pero la triunfadora sin duda es la opción -l ya que, además de hacer que devuelva sólo el nombre del fichero y así no tener que utilizar luego awk para extraerlo, si el texto aparece más de una vez en el fichero, este sólo es devuelto una vez.
El jueves yo buscaba un texto que sólo aparecía una vez en los ficheros y por eso no me encontré varias veces el mismo fichero en el vim.
Y luego está el sed, esa mala bestia de la consola que sin duda debería utilizar mucho más.
Voy a darle una vuelta al post con todo esto. Gracias Porras.
Felices fiestas!
Cuidadín si estamos en un repo de subversion: grep encontrará también los textos dentro de las carpetas .svn
Escribe un comentario