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 ?

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.


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.


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.


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).


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'.


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 .


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.