Curso de Vim: cómo buscar y reemplazar un texto en múltiples archivos con #Vim

Aprenderemos cómo buscar y reemplazar una cadena de texto en varios archivos gracias al editor Vim

Imaginemos que tenemos una carpeta en nuestro equipo con varios archivos y en todos ellos queremos buscar un texto y reemplazarlo por otro. Por ejemplo el nombre de una variable en un código, un nombre de una función, un nombre de unos capítulos de nuestra novela, etc

Una opción sería abrir uno por uno todos esos archivos, buscar la cadena a modificar y cambiarlo. Pero como ya hemos aprendido muchas herramientas de la línea de comandos y vamos dominando el editor Vim, vamos a conjugar ambas habilidades y ahorrarnos tiempo y trabajo.

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:

Y para aprender Vim (de la manera más inteligente) aquí tienes esta útil guía:

Este artículo es una adaptación del artículo en inglés escrito por Victoria Drake para la web freecodecamp y parte de la guía para aprender Vim de la manera más inteligente:

Tal como he planteado en el ejemplo, podremos buscar y reemplazar un texto presente en diferentes archivos gracias a comandos como find y grep de la terminal y Vim.

Vamos a imaginar que estamos en una carpeta con varios archivos en Python, y en todos ellos queremos encontrar la palabra «foo» abrir esos archivos con Vim y después sustituirla por «bar».

Primero vamos a buscar en la carpeta actual llamada Scripts todos los archivos de Python mediante:

find . -name '*.py'

Nos mostrará una lista de todos los archivos en esa carpeta que tienen dicha extensión. Ahora vamos a buscar en esos archivos cuales tienen la cadena «foo» y abrirlos con el editor Vim ejecutando el comando:

find -name "*py" | xargs grep -il 'foo' | xargs vim

Vim abrirá todos esos archivos encontrados en diferentes buffers, tienes más información sobre el tema en la guía para aprender Vim de la manera más inteligente.

Ahora en Vim, basta con ejecutar el comando de sustitución de una cadena por otra en Vim, pero diciéndole que lo haga en todos los buffers abiertos anteponiendo el comando :bufdo. Algo similar a esto:

:bufdo %s/foo/bar/gc

Al comando de sustitución (%s) de una cadena (foo) por otra (bar) le hemos añadido las opciones gc:

  • g → para indicar que realice la sustitución de manera global en todo el archivo
  • c → para que pregunte en cada cadena encontrada si debemos realizar el cambio o no

Acabada la tarea, podremos guardar todos los cambios de todos los archivos abiertos en los buffers, mediante:

:bufdo wq

Y de un plumazo gracias a Vim y a un par de comandos de la terminal habremos resuelto una tarea que podría convertirse en tediosa por el tiempo que puede llevar.

¿Te ha resultado útil? ¿Tienes una manera mejor de realizar esta tarea? Comparte tus ideas y sugerencias en los comentarios.

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.