Introducción
Este artículo describe cómo buscar y reemplazar texto en Vim / Vi.
Vim es el editor de texto de línea de comandos más popular. Viene preinstalado en macOS y la mayoría de las distribuciones de Linux. Encontrar y reemplazar texto en Vim es rápido y fácil.
Encontrar y reemplazar
En Vim, puede buscar y reemplazar texto usando el comando :substitute
( :s
).
Para ejecutar comandos en Vim, debe estar en modo normal, el modo predeterminado cuando inicia el editor. Para volver al modo normal desde cualquier otro modo, simplemente presione la tecla " Esc ".
La forma general del comando de reemplazo es la siguiente:
:[range]s/{pattern}/{string}/[flags] [count]
El comando busca un {pattern}
en cada línea [range]
y lo reemplaza con un {string}
. [count]
es un número entero positivo que multiplica el comando.
Si no [range]
, y [count]
se les da, sólo se reemplaza el patrón que se encuentra en la línea actual. La línea actual es la línea donde está posicionado el cursor.
Por ejemplo, para buscar la primera aparición de la cadena ' foo
' en la línea actual y reemplazarla con ' bar
', usaría:
:s/foo/bar/
Para reemplazar todas las apariciones del patrón de búsqueda en la fila actual, agregue la bandera g
:
:s/foo/bar/g
Si desea buscar y reemplazar texto en todo el archivo, use el carácter de porcentaje %
como rango. Este carácter indica un rango desde la primera hasta la última línea del archivo:
:%s/foo/bar/g
Si {string}
se omite la parte , se trata como una cadena vacía y se elimina el patrón correspondiente. El siguiente comando elimina todas las instancias de la cadena ' foo
' en la línea actual:
:s/foo//g
En lugar del carácter de barra inclinada ( /
), se puede utilizar cualquier otro carácter no alfanumérico de un solo byte excepto como delimitador. Esta opción es útil cuando tiene el carácter " /
" en la cadena de búsqueda o en la cadena de reemplazo.
:s|foo|bar|
Para confirmar cada reemplazo, use la bandera c
:
:s/foo/bar/gc
replace with bar (y/n/a/q/l/^E/^Y)?
Presione y
para reemplazar el fósforo o l
para reemplazar el fósforo y salir. Presione n
para omitir el resultado actual q
o Esc
para cancelar el reemplazo. La opción a
reemplaza el partido y todas las ocurrencias restantes del partido. Para desplazar la pantalla hacia abajo, use CTRL+Y
y para desplazarse hacia arriba, use CTRL+E
.
También puede utilizar expresiones regulares como patrón de búsqueda. El siguiente comando reemplaza todas las líneas que comienzan con ' foo
' con 'Vim':
:%s/^foo.*/Vim/gc
El símbolo ^
( signo de intercalación) coincide con el comienzo de una línea y .*
coincide con cualquier número de caracteres.
Mayúsculas y minúsculas (sensibilidad a mayúsculas y minúsculas)
De forma predeterminada, la operación de búsqueda distingue entre mayúsculas y minúsculas, una búsqueda de " FOO
" no coincidirá con " Foo
".
Para ignorar el uso de mayúsculas y minúsculas en la cadena de búsqueda, use la bandera i
:
:s/Foo/bar/gi
Otra forma de ignorar las mayúsculas es agregar \c
después del patrón de búsqueda. Por ejemplo, /Linux\c
busca e ignora mayúsculas y minúsculas.
Si ha cambiado la sensibilidad predeterminada a mayúsculas y minúsculas y desea realizar una búsqueda sensible a mayúsculas y minúsculas, use la marca I
:
:s/foo/bar/gi
El método alternativo en este caso es agregar \C
después de la cadena de búsqueda.
Rango de búsqueda
Cuando no se especifica ningún rango, el comando de sustitución funciona solo en la línea actual.
El rango puede ser una línea o un rango entre dos líneas. Los especificadores de línea están separados por los caracteres ,
o ;
. El rango se puede especificar utilizando el número de línea absoluto o símbolos especiales.
Por ejemplo, para reemplazar todas las apariciones de " foo
" con " bar
" en todas las líneas desde la línea 3 a la línea 10, use este comando:
:3,10s/foo/bar/g
El rango es inclusivo, lo que significa que la primera y la última fila se incluyen en el rango.
El carácter de punto .
indica la línea actual y el signo de dólar $
indica la última línea. Para reemplazar ' foo
' en todas las líneas desde la línea actual hasta la última, use este comando:
:.,$s/foo/bar/
El especificador de línea también se puede establecer mediante el símbolo " +
" o " -
", seguido de un número que se suma o resta del número de línea anterior. Si se omite el número después del símbolo, el valor predeterminado es 1.
Por ejemplo, para reemplazar cada " foo
" por " bar
" a partir de la línea actual y las siguientes cuatro líneas, escriba:
:.,+4s/foo/bar/g
Reemplazar toda la palabra
El comando sustituto busca el patrón como una cadena, no como una palabra completa. Por ejemplo, si está buscando " gnu
", la búsqueda encuentra coincidencias donde " gnu
" está incrustado en palabras más grandes, como " cygnus
" o " magnum
".
Para buscar una palabra completa, escriba \<
para marcar el comienzo de una palabra, ingrese el patrón de búsqueda, escriba \>
para marcar el final de una palabra:
Por ejemplo, para buscar la palabra " foo
", usaría \<foo\>
:
:s/\<foo\>/bar/
Reemplazar historial
Vim realiza un seguimiento de todos los comandos ejecutados en la sesión actual. Para explorar el historial de comandos de reemplazo anteriores, ingrese :s
y use las teclas de flecha arriba / abajo para encontrar una operación de reemplazo anterior. Para ejecutar el comando, simplemente presione Enter
. También puede editar el comando antes de realizar la operación.
Ejemplos
Comentarios de líneas (agregar #
antes de la línea) desde 5
hasta 20
:
:5,20s/^/#/
Descomentar líneas 5
para 20
deshacer cambios anteriores:
:5,20s/^#//
Reemplace todas las apariciones de " mela
", " arancia
" y " mango
" con " frutta
":
:%s/apple\|orange\|mango/fruit/g
Elimine los espacios en blanco finales al final de cada línea:
:%s/\s\+$//e
Conclusión
Buscar y reemplazar es una característica poderosa de Vim, que le permite realizar cambios de texto rápidamente.