Sostituisci usando VIM, riutilizza parte del pattern di ricerca

Sto lavorando con VIm e sto provando a impostare un comando cerca e sostituisci per eseguire alcune sostituzioni in cui posso riutilizzare lespressione regolare che fa parte della mia stringa di ricerca.

Un semplice esempio potrebbe essere una riga in cui voglio sostituire (10) a {10}, dove 10 può essere qualsiasi numero.

Sono arrivato fin qui

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

che corrisponde esattamente alla parte che voglio.

Ora la sostituzione, ho provato

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

Ma, questo dà come output {(10)}

Quindi, ho provato

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

Tuttavia, questo ha dato me ({10}), che anchio chiudo, ma non quello che voglio.

Penso di aver bisogno di un altro tipo di contrassegno / riferimento a ritroso invece di questo \0, ma non so dove cercare. Quindi la domanda è: si può fare in vim, un nd se sì, come?

Risposta

\0 è lintera corrispondenza. Per usarne solo una parte devi impostarlo in questo modo e utilizzare \ 1

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

Istruzioni più dettagliate puoi trovare qui o nella guida di vim.

Commenti

  • Nota che le parentesi per lacquisizione sono precedute da una barra rovesciata.

Risposta

Recentemente ho ereditato del codice legacy e volevo sostituire tutte le occorrenze come:

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

a

logging.info("xy") 

o

logging.info(x,y) 

Basandosi sulla risposta precedente e nella speranza che qualcuno ne trarrà vantaggio, ho utilizzato il seguente comando, che cambierà tutte le occorrenze:

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

Se sostituisci % con . e rimuovi /g ti ritroverai con

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

che ti consentirà di andare oltre ogni corrispondenza e scegli se modificarla o meno.

Rispondi

Il modo migliore per consentirti di esaminare ogni corrispondenza è aggiungi una “c” alla fine del codice, invece di andare riga per riga

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

Commenti

  • Questo ' non risponde in alcun modo alla domanda originale

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *