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