Reemplace usando VIM, reutilice parte del patrón de búsqueda


29

Estoy trabajando VIme intentando configurar un comando de búsqueda y reemplazo para hacer algunos reemplazos donde pueda reutilizar la expresión regular que es parte de mi cadena de búsqueda.

Un ejemplo sencillo sería una línea en la que quiero reemplazar (10)a {10}, donde 10 puede ser cualquier número.

Llegué tan lejos

  .s/([0-9]*)/what here??/

que coincide exactamente con la parte que quiero.

Ahora el reemplazo, intenté

  .s/([0-9]*)/{\0}/

Pero, esto da como salida {(10)}

Entonces intenté

 .s/(\zs[0-9]*\ze)/{\0}/

Sin embargo, eso me dio ({10}), que también cierro, pero no lo que quiero.

Creo que necesito otro tipo de marcado / referencia en lugar de esto \0, pero no sé dónde buscar. Entonces la pregunta es, ¿se puede hacer esto en vim, y si es así, cómo?

Respuestas:


37

\0Es todo el partido. Para usar solo una parte, debe configurarlo así y usar \ 1

.s/(\([0-9]*\))/{\1}/

Puede encontrar instrucciones más detalladas aquí o en vim help.


Tenga en cuenta que los paréntesis para la captura tienen una barra invertida escapada.
Randall

0

Recientemente heredé un código heredado y quería reemplazar todas las ocurrencias como:

print "xx"
print x,y
print 'xx'

a

logging.info("xy") 

o

logging.info(x,y)

Sobre la base de la respuesta anterior y con la esperanza de que alguien se beneficie de ella, utilicé el siguiente comando, que cambiará todas las ocurrencias:

%s/print\( .*\)/logging.info\(\1\)/g

Si sustituye %con .y eliminar /gel resultado final será con

.s/print\( .*\)/logging.info\(\1\)

eso te permitirá revisar cada partida y elegir si la cambias o no.


0

La mejor manera de permitirle repasar cada coincidencia es agregar una "c" al final del código, en lugar de ir línea por línea

%s/print\( .*\)/logging.info\(\1\)/gc

Esto realmente no responde a la pregunta original de ninguna manera
Bernhard
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.