Veamos cómo buscar y reemplazar una cadena de texto en múltiples archivos gracias a un par de comandos de GNU/Linux y el editor Vim
Existen muchos comandos para buscar y reemplazar una palabra o una cadena en un único archivo, pero ¿qué hacer cuando quieres hacerlo en múltiples archivos con nombres diferentes?
Gracias a un par de comandos de GNU/Linux y el uso del editor Vim podremos hacer esa tarea tediosa de una manera rápida y sencilla.
Este artículo es una nueva entrega del curso “improVIMsado” que desde hace meses vengo publicando en mi blog sobre el editor Vim y que puedes seguir en estos enlaces:
- https://victorhckinthefreeworld.com/tag/vim/
- https://victorhck.gitlab.io/comandos_vim/articulos.html
Este artículo es una traducción/adaptación de un artículo escrito en inglés por la desarrolladora Victoria Drake que ha publicado en su blog y que está disponible en este enlace.
Los dos comandos que utilizaremos serán find y grep, pero vayamos por partes.
Lo primero será encontrar encontrar todos los archivos que queremos modificar. En este ejemplo buscaremos todos los archivos con extensión .py en el nombre para ello:
find . -name '*.py'
Para afinar más la búsqueda, queremos encontrar una cadena de texto dentro de los archivos, para ello utilizaremos el comando grep. Así que utilizaremos el comando:
grep -le '\<variavle\>'
Con la opción -l grep nos devolverá el nombre de los archivos en los que encuentre el patrón de búsqueda que indicamos con -e y que en este caso es «variavle».
Con esto ya podremos encontrar los archivos y el texto que queremos, ahora entra en acción el editor Vim para terminar de realizar la tarea.
Para ello utilizaremos la herramienta :bufdo que permite ejecutar el mismo comando en múltiples ventanas abiertas en este editor de texto.
Sin necesidad de ir archivo por archivo, abriéndolo, modificándolo y guardando los cambios.
Ahora unimos todo y con este comando decimos a Vim que nos abra los archivos que queremos con la cadena de texto que queremos buscar:
vim `find . -name '*.py' \
-exec grep -le '\<variavle\>' {} \;`
Utilizaremos la expansión de las comillas invertidas para pasar nuestra búsqueda a Vim y abrirlas en múltiples ventanas o «buffers».
Una vez que tenemos en Vim abiertos todos los archivos mediante el comando :bufdo realizaremos las acciones que queramos.
En este ejemplo reemplazaremos el término «variavle» por el término «variable» mediante el siguiente comando:
:bufdo %s/variavle/variable/gce
Utilizaremos la opción g para indicar que el cambio queremos que sea global en todas las ocurrencias que encuentre.
La opción e omitirá los errores encontrados si el patrón de búsqueda no es encontrado.
La opción c hará el reemplazo del texto interactivo y pedirá confirmación en cada caso que encuentre. Si no queremos que pregunte, no incluiremos esa opción en el comando anterior.
Cuando el editor Vim haya acabado todas las tareas, simplemente guardaremos los datos y cerraremos todos los buffers mediante el comando:
:bufdo wq!
Y así Vim y los comandos de GNU/Linux nos han liberado un montón de tiempo y trabajo tedioso que podremos utilizar en leer el blog de Victoria Drake o este mismo. 🙂