Reemplazar usando VIM, reutilizar parte del patrón de búsqueda

Estoy trabajando con VIm e intento configurar un comando buscar y reemplazar para hacer algunos reemplazos donde puedo reutilizar la expresión regular que es parte de mi cadena de búsqueda.

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

Llegué hasta aquí

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

que coincide exactamente con la parte que quiero.

Ahora el reemplazo, probé

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

Pero, esto da como resultado {(10)}

Luego, probé

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

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

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

Answer

\0 es la coincidencia completa. Para usar solo una parte, debe configurarlo así y usar \ 1

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

Puede encontrar instrucciones más detalladas aquí o en la ayuda de vim.

Comentarios

  • Tenga en cuenta que los paréntesis para la captura tienen un escape de barra invertida.

Respuesta

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) 

Partiendo 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 elimine /g terminará con

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

que le permitirá superalo cada coincidencia y elija si la cambia o no.

Responder

La mejor forma de permitirle repasar cada coincidencia es agregue una «c» al final del código, en lugar de ir línea por línea

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

Comentarios

  • Esto realmente no ' no responde la pregunta original de ninguna manera

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *