Este es uno de los capítulos del tutorial Vim, un editor atemporal. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
De entre las operaciones mas habituales que suelo hacer, probablemente las de buscar y buscar y reemplazar, sean de las mas recurrentes. Es inevitable, o al menos, es inevitable para mi. Así, por ejemplo, escribir un artículo y querer reemplazar una palabra por otra, o simplemente buscar una determinada palabra dentro de un texto, porque me he dado cuenta que la he repetido hasta la saciedad, es algo que me suele suceder de forma habitual. Y esto, cuando escribes con poca asiduidad, tampoco tiene mucha importancia, simplemente te desplazas a la palabra que quieres cambiar y punto. Sin embargo, cuando como yo, sueles escribir una o mas horas al día, esto de buscar y reemplazar se vuelve algo realmente importante. Y precisamente aquí es donde interviene Vim, porque buscar y reemplazar en Vim es de lo mas potente, en tanto en cuanto, pone al alcance de tus dedos todo el poder de las expresiones regulares. Y realmente, tener a tu disposición las expresiones regulares es una garantía de éxito.
Así en esta capítulo de Vim, entrarás a fondo en las opciones que tienes para buscar y reemplazar en Vim. Y, por supuesto, acompañado, de sus correspondientes ejemplos, para poder sacarle todo el jugo.
Buscar y reemplazar en Vim
Antes que nada quiero referirte al capítulo sobre comodines y expresiones regulares del tutorial sobre el terminal. En este capítulo, te doy algunas pinceladas sobre las expresiones regulares, necesarias para sacar todo el potencial que te ofrece Vim para tratar las búsquedas y reemplazos.
Buscando en Vim
Para realizar una búsqueda en Vim, desde el modo normal solo tienes que pulsar /
. Recuerda que si estás en el modo insertar, con la combinación de teclas Ctrl+O
, pasas puntualmente al modo normal. Una vez introducida la cadena de búsqueda, pulsas enter
, y aparecerán todas las coincidencias resaltadas. Si quieres quitar ese resaltado simplemente utiliza el comando :noh
.
En el caso de que veas que no se resaltan los resultados, y realmente existan resultados correspondientes a la búsqueda que estás realizando, simplemente utiliza la opción :set highlight
.
Una vez realizada la búsqueda conforme te he indicado anteriormente, y resaltados todos los resultados puedes navegar entre ellos utilizando,
N
para ir al siguiente resultadoMayúsc+N
para ir al resultado anterior
Indicarte que si en lugar de utilizar /
utilizas ?
realizarás la búsqueda hacia atrás. Es decir, con /
realizas las búsquedas desde la posición que te encuentras hacia adelante. Mientras que con ?
realizas las búsquedas desde donde te encuentras hacia atrás.
Recordarte que tal y como viste en el capítulo sobre el lenguaje de Vim, siempre, puedes desplazarte en busca de un carácter dentro de una línea, en el modo normal, utilizando f<caracter>
y t<caracter>
para buscar hacia adelante. Y F<caracter>
y T<caracter>
para buscar ese carácter hacia atrás en la misma línea.
Pero no solo esto, si te encuentras en el modo normal, te sitúas sobre una palabra y pulsas *
, se resaltarán todas las coincidencias de esa misma palabra a lo largo de todo el documento. Por supuesto, puedes desplazarte como he indicado anteriormente.
Por resumir,
/<texto>
busca<texto>
hacia adelante?<texto>
busca<texto>
del cursor hacia atrást<caracter>
salta hasta el<caracter>
siguienteT<caracter>
salta hasta el<caracter>
precedentef<caracter>
salta sobre el<caracter>
siguienteF<caracter>
salta sobre el<caracter>
precedenten
te mueve a la siguiente localización de la palabra que buscasN
en este caso salta a la localización precedente;
salta sobre el siguiente cárácter, relativo al último que te moviste,
idem que en el caso anterior, pero en lugar de al siguiente, al precedente
Reemplazando en Vim
Pero de verdad, si hay algo que me tiene completamente enamorado es reemplazar en Vim. Es algo realmente espectacular. Tener al alcance de tus dedos todo el potencial de las expresiones regulares para buscar y reemplazar en Vim, es algo que, sinceramente, me fascina.
Sintaxis
Aquí si me quiero detener un poco, y dejar mas o menos clara la sintaxis a la hora de buscar y reemplazar en Vim. Fíjate,
:rango s/patron/reemplazo/[cgil]
Respecto al rango, puede ser alguno de los que indico a continuación, una combinación o ninguno de ellos. Quiero decir con esto que el rango
es totalmente opcional, siempre puedes omitirlo
numero
se refiere a la búsqueda y reemplazo en una línea concretainicio,fin
de la líneainicio
a la líneafin
.
para la línea actual$
se refiere a la última línea del archivo%
se refiere a todo el archivo
Existen algunas opciones mas de las que te he indicado, pero con estas, seguro que abarcas la mayor parte de los casos que necesites. Algunos ejemplos,
:5,10s/casa/caso/g
reemplazacasa
porcaso
entre las líneas 5 y 10 del documento.:%s/casa/caso/g
se comporta igual que el caso anterior, pero lo hace en todo el documento.
Por otro lado, respecto a las opciones cgil
que aparecen en la sintaxis indicadas anteriormente,
c
te obliga a confirmara cada una de las sustituciones.g
reemplaza todas las ocurrencias de la línea. Si no se añade esta opción solo cambiará la primera de las apariciones en la línea.i
no distingue entre mayúsculas y minúsculas.l
diferencia entre mayúsculas y minúsculas.
Así, por en general, la forma de cambiar todas las apariciones de la palabra casa
en un texto, es tan sencillo como :%s/casa/caso/g
si además no quieres hacer distinción entre mayúsculas y minúsculas :%s/casa/caso/gi
Expresiones regulares
Llegados a este punto, y para sacar el máximo provecho, tendrás que hacer uso de las expresiones regulares. Para ello, de nuevo te remito al capítulo comodines y expresiones regulares del tutorial sobre el terminal
Algunos ejemplos
A continuación te dejo algunos ejemplos para que te hagas una idea del potencial que tienen tanto las expresiones regulares como el uso de reemplazar con Vim.
:%s/print\s*.*$/print(\1)
le pone paréntesis a todos los print:%s/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$//g
elimina colores en hexadecimal:%s/^(?:[0-9a-f]{2}[\-:]?){6}(?<![\-:])$//g
elimina las direcciones MAC:%s/<!\[CDATA\[(.*)\]\]>//g
eliminar etiquetasCDATA
Más información,
Para pegar en el modo comando (:), el texto que hayas seleccionado previamente en el modo visual (.. VISUAL –), debes pulsar + »
Esto es útil para el reemplazar por ejemplo.