Înlocuiți utilizând VIM, refolosiți o parte din modelul de căutare

Lucrez cu VIm și încerc să configurez un comanda căutare și înlocuire pentru a face unele înlocuiri în care pot reutiliza expresia regulată care face parte din șirul meu de căutare.

Un exemplu simplu ar fi o linie în care vreau să înlocuiesc (10) la {10}, unde 10 poate fi orice număr.

Am venit până aici

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

care se potrivește exact cu partea pe care o doresc.

Acum înlocuitorul, am încercat

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

Dar, acest lucru dă ca ieșire {(10)}

Apoi, am încercat

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

Cu toate acestea, eu ({10}), pe care îl închid și eu, dar nu ceea ce vreau.

Cred că am nevoie de un alt tip de marcare / referință inversă în locul acestui \0, dar nu știu unde să caut. Deci întrebarea este, se poate face acest lucru în vim, a Dacă da, cum?

Răspuns

\0 este întreaga potrivire. Pentru a utiliza doar o parte din aceasta, trebuie să o setați astfel și să utilizați \ 1

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

Instrucțiuni mai detaliate puteți găsi aici sau în vim help.

Comentarii

  • Rețineți că parantezele pentru captură sunt backslash-escaped.

Răspuns

Am moștenit recent un cod vechi și am vrut să înlocuiesc toate aparițiile precum:

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

la

logging.info("xy") 

sau

logging.info(x,y) 

Bazându-ne pe răspunsul anterior și în speranța că cineva va beneficia de el, am folosit următoarea comandă, care va schimba toate aparițiile:

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

Dacă înlocuiți % cu . și eliminați /g veți termina cu

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

care vă va permite să treci peste fiecare meci și alegeți dacă îl modificați sau nu.

Răspundeți

O modalitate mai bună de a vă permite să treceți peste fiecare meci este să adăugați un „c” la sfârșitul codului, în loc să mergeți rând cu rând

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

Comentarii

  • Acest lucru într-adevăr nu ' nu răspunde la întrebarea inițială în niciun fel

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *