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?

Bernhard
fuente

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.

prisa
fuente
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.

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