Puedo hacer :%s/<search_string>/<replace_string>/g
para reemplazar una cadena a través de un archivo, o :s/<search_string>/<replace_string>/
para reemplazar en la línea actual.
¿Cómo puedo seleccionar y reemplazar palabras de líneas selectivas en vim?
Ejemplo: reemplazar texto de líneas 6-10
, 14-18
pero no de 11-13
.
Respuestas:
El
:&&
comando repite la última sustitución con las mismas banderas. Puede suministrarle los rangos adicionales (y concatenar tantos como desee):Sin embargo, si tiene muchos rangos , prefiero usar un bucle:
fuente
:6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&
también funcionará,for
loop lo hace más fácil de recordar y ejecutar.:
en los comandos posteriores es opcional, por cierto, por lo que puede guardar más pulsaciones de teclas.:&&
me ahorrará cientos de pulsaciones de teclas por semana. ¡Gracias!Reemplaza todo:
Encuentre cada aparición de 'foo' (en todas las líneas) y reemplácela con 'bar'.
Para líneas específicas:
Cambie cada 'foo' a 'bar' para todas las líneas desde la línea 6 a la línea 10 inclusive.
fuente
/
, es donde se indican las banderas para la operación. Este comando normalmente reemplazará la primera coincidencia en una línea; Con lag
bandera reemplazará todas las ocurrencias.%
cosa hace el trabajo! De lo contrario, es solo la primera vez.%
=> ejecuta este comando en todas las líneas.g
=> coincide con múltiples ocurrencias en la misma línea.Como nota al margen, en lugar de tener que escribir los números de línea, solo resalte las líneas donde desea buscar / reemplazar en uno de los modos visuales:
VISUAL
modo ( V)VISUAL BLOCK
modo ( Ctrl+ V)VISUAL LINE
modo ( Shift+ V, funciona mejor en su caso)Una vez que haya seleccionado las líneas para reemplazar, escriba su comando:
Notarás que el rango
'<,'>
se insertará automáticamente para ti:Aquí
'<
simplemente significa la primera línea resaltada y'>
significa la última línea resaltada .Tenga en cuenta que el comportamiento puede ser inesperado cuando está en
NORMAL
modo:'<
y'>
señale el inicio y el final del último resaltado realizado en uno de losVISUAL
modos. En cambio, enNORMAL
modo,.
se puede usar el número de línea especial , que simplemente significa la línea actual . Por lo tanto, puede encontrar / reemplazar solo en la línea actual como esta:Otra cosa a tener en cuenta es que insertar un segundo
:
entre el rango y el comando buscar / reemplazar no hace daño, en otras palabras, estos comandos seguirán funcionando:fuente
Puedes hacerlo con dos secuencias de buscar / reemplazar
La segunda vez, todo lo que necesita ajustar es el rango, por lo que en lugar de escribirlo todo, recordaría el último comando y editaría solo el rango
fuente
En vim, si está confundido sobre qué líneas se verán afectadas, use a continuación
Cambie cada 'foo' a 'bar', pero solicite confirmación primero. Presione 'y' para sí y 'n' para no. No olvides guardar después de eso
fuente
c
bandera además de especificar el rango, por lo que:6,10s/<search_string>/<replace_string>/c
funciona.c
representaconfirm
. Utilizo lac
bandera con bastante frecuencia para evitar reemplazar accidentalmente palabras donde no pensaba que también existen allí.VI buscar y reemplazar ejemplos de comandos
Digamos que le gustaría encontrar una palabra llamada "foo" y reemplazarla con "bar".
[Esc]
Tecla de primer golpeEscriba: (dos puntos) seguido de
%s/foo/bar/
y presione la tecla [Enter]:%s/foo/bar/
fuente
:%s/<search_string>/<replace_string>/g
comando reemplazará todas las ocurrencias en todo el archivo. No es exactamente la respuesta a la pregunta, pero útil, sin embargo :)No necesitamos molestarnos en ingresar el número de línea actual.
Si desea cambiar cada uno
foo
abar
la línea actual (.
) y las dos líneas siguientes (+2
), sólo tiene que hacer:Si desea confirmar antes de realizar cambios, reemplace
g
congc
:fuente
:.,$s/foo/bar/gc
buscar y reemplazar desde la línea actual hasta el final del archivo.Buscar y reemplazar
g => búsqueda global
c => Pedir confirmación primero
i => mayúsculas y minúsculas
Si desea un reemplazo directo sin confirmación, use el siguiente comando
Si desea confirmación para cada reemplazo, ejecute el siguiente comando
Solicite confirmación primero, aquí la búsqueda no distingue entre mayúsculas y minúsculas.
fuente
Está bien especificar el rango a través de la selección visual, pero cuando hay operaciones muy simples en un par de líneas que un operador puede seleccionar, lo mejor sería aplicar estos comandos como operadores.
Lamentablemente, esto no se puede hacer a través de los comandos vim estándar. Podrías hacer una especie de solución usando el! (filtro) operador y cualquier objeto de texto. Por ejemplo, para aplicar la operación a un párrafo, puede hacer:
Esto debe leerse como "¡Aplicar el operador! Dentro de un párrafo". El operador de filtro inicia el modo de comando e inserta automáticamente el rango de líneas seguido de un literal "!" que puedes eliminar justo después. Si aplica esto, al siguiente párrafo:
El resultado después de presionar "! Ap" sería como:
Como el '.' (punto) significa la línea actual, el rango entre la línea actual y las 5 líneas posteriores se utilizarán para la operación. Ahora puede agregar el comando sustituto de la misma manera que antes.
Lo malo es que esto no es más fácil que seleccionar el texto para luego aplicar el operador. Lo bueno es que esto puede repetir la inserción del rango para otros rangos de texto similares (en este caso, párrafos) con un tamaño visiblemente diferente. Es decir, si luego desea seleccionar el rango más grande, el párrafo '.' Voluntad a la derecha.
Además, si le gusta la idea de usar objetos de texto semántico para seleccionar el rango de operación, puede verificar mi complemento EXtend.vim que puede hacer lo mismo pero de una manera más fácil.
fuente
Para responder esta pregunta:
:40,50s/foo/bar/g
reemplace foo con barra en estas líneas entre la línea 40 y la línea 50 (inclusive), cuando ejecute este comando, puede hacerlo en cualquier línea.
:50,40s/foo/bar/g
también funciona, vim le pedirá confirmación y luego hará el reemplazo por usted como si hubiera ingresado el primer comando.
:,50s/foo/bar/g
reemplace foo con barra en estas líneas entre la línea en la que se encuentra actualmente y la línea 50 (inclusive). (si está en una línea DESPUÉS de la línea 50, vim le pedirá confirmación nuevamente)
Para aclarar la diferencia entre vim y el complemento vrapper de Eclipse:
Tenga en cuenta que en varpper
:,50s/foo/bar/g
El comando NO funcionará.:50,40s/foo/bar/g
funcionará sin pedir confirmación.(Para la versión Vrapper 0.74.0 o anterior).
fuente
Suponga que si desea reemplazar lo anterior con alguna otra información.
COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)
En esto, lo anterior se reemplazará con (
sys.pkg.mpu.umc.kdk.
).fuente
%s
para modificar la entrada, pero quiere saber cómo hacerlo "semi-globalmente" (es decir, su especificación son las líneas 6-10 y 14-18 pero no en las líneas 11- 13)/
, por ejemplo!
,@
,_
::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g