Cómo reemplazar texto en vim sólo dentro un patrón concreto
Vim es tan poderoso que es imposible decir la frase Ya sé todo vim. Nadie puede dominar todas las facetas de este editor y siempre aprendes algo nuevo (casi) cada día.
Yo no soy ni mucho menos un experto en Vim pero desde luego es el editor que más uso (por no decir el único) y por lo tanto estos años he aprendido bastantes truquis para realizar tareas cotidianas escribiendo código.
El otro día me vi en la necesidad de buscar en google (el comando :help
no fue suficiente) acerca de un problema que no sabía solucionar: Básicamente tenía un archivo JSON de un sólo nivel en el que las claves eran zonas horarios (por ejemplo America/New_York
) y los valores eran iguales a las claves pero yo tenía que quitar los _
de los valores, y no de las claves.
{
...
"America/New_York": "America/New_York"
...
}
Lo que se me ocurrió fue hace una expresión regular que seleccionase tan solo la parte después del :
en cada línea. El único problema es que después no sabía que hacer con esto.
Esta respuesta de stackoverflow me dio la solución y aprendí a usar el positive look-behind, osea este pedazo de una expresión regular \@<=
. La solución a mi problema era tal que así:
:%s/\(:.*\)\@<=_/ /g
Este comando reemplaza sólo los _
de los valores y no de las claves, dado que selecciona todo lo que está después de :
de esta manera :.*
.
Y ya está, no me voy a expandir más pero tengo pensado publicar más soluciones a problemas cotidianos que vaya encontrando, y no sólo de Vim.