Búsqueda interactiva / reemplazar regex en Vim?

265

Conozco la expresión regular para hacer un reemplazo global,

     %s/old/new/g

¿Cómo se hace para hacer una búsqueda interactiva de reemplazo en Vim ?

kal
fuente

Respuestas:

463

Agregue la bandera c (en el símbolo del sistema vim):

:%s/old/new/gc

le dará un sí / no en cada aparición de 'viejo'.

"viejo" se resalta en el texto;  en la parte inferior de la ventana dice "reemplazar con nuevo (y / n / a / q / l / ^ E / ^ y)?)"

La ayuda integrada de Vim ofrece información útil sobre las opciones disponibles una vez que se ha seleccionado la sustitución con confirmación. Utilizar:

:h :s

Luego, vaya a la sección sobre las opciones de confirmación. Captura de pantalla a continuación:

Texto que dice "[C] Confirme cada sustitución. [...] CTRL-Y para desplazar la pantalla hacia abajo"

Por ejemplo, para sustituir esta y todas las coincidencias restantes, use a.

Mark Biek
fuente
30
+1, ¡aprendí algo nuevo hoy! vim tiene tantos secretos ocultos .. :)
Marc Novakowski 03 de
10
Aprender los comandos vim es un poco como jugar Nethack. Nunca se sabe qué maravillas va a tener un solo personaje.
Mark Biek
22
Me imagino que la "c" es para "confirmar"
matpie 03 de
8
Sinceramente, no estoy tratando de parecer tan sarcástico, pero todo esto podría haberse encontrado haciendo ": help: s", que lo habría llevado directamente a ": help: s_flags".
Jeremy Cantrell
13
@ jeremy: eso requiere saber que existe el comando de ayuda, y saber que uno necesita escribir "dos puntos" para acceder al archivo de ayuda correspondiente. ¿Cómo o dónde se aprendería eso?
Dennis
79

Mark Biek señaló usando:

%s/old/new/gc

para una búsqueda global, reemplace con la confirmación de cada sustitución. Pero, también disfruto verificando interactivamente que el texto anterior coincida correctamente. Primero hago una búsqueda con una expresión regular, luego reutilizo ese patrón:

/old.pattern.to.match
%s//replacement/gc

El s//utilizará el último patrón de búsqueda.

Vincent Scheib
fuente
9
¡Una de las mejores cosas de usar / aprender vim es cuán profundo es el agujero del conejo!
Ken
2
Agradable, siempre hacía la búsqueda, luego usaba <Cr> / para pegar la última búsqueda en el comando sustituto.
Atilla Filiz
¡Exactamente lo que extraño de Sublime Text!
Xenofex
Esta respuesta es particularmente útil, ya que imagino que muchas veces decide reemplazar instancias de una palabra, es la palabra que acaba de buscar.
M_M
20

Creo que está buscando c, por ejemplo s/abc/123/gc, esto hará que VIM confirme los reemplazos. Ver: ayuda: sustituto para más información.

Logan Capaldo
fuente
9

Usualmente uso el comando find / sustitute / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Eso de find "old", substitute 3 characters for "new", find next,repeat substitute , y así sucesivamente.

Es un dolor para las sustituciones masivas, pero le permite ignorar selectivamente algunas ocurrencias antiguas (simplemente presionando n nuevamente para encontrar la siguiente en lugar de .repetir una sustitución).

paxdiablo
fuente
Yo también uso esto, incluso para textos similares. (3cW <texto> <ESC> <mover a nueva ubicación>. <mover>. <move>.)
extraño
1
¡No es un antipatrón! Es dulce. Y puede buscar en la dirección opuesta usando N. Muy bueno si ve una palabra y quiere cambiarla. * cwNewText <ESC> Nnn (Esto saltará lejos de la palabra debajo del cursor, pero luego saltará hacia atrás tan pronto como haya cambiado la próxima aparición.
PEZ
lo que es <CR>?
Sother
9

Si solo desea contar el número de ocurrencias de 'abc', puede hacerlo %s/abc//gn. Esto no reemplaza nada, solo informa el número de ocurrencias de 'abc'.

Amjith
fuente
3

Si su texto de reemplazo necesita cambiar para cada ocurrencia coincidente (es decir, no simplemente eligiendo Sí / No para aplicar un reemplazo singular), puede usar un complemento Vim que hice llamado interactivo-reemplazar .

hwrod
fuente