Jeg jobber med VIm
og prøver å sette opp en søk og erstatt kommandoen for å gjøre noen erstatninger der jeg kan bruke det vanlige uttrykket som er en del av søkestrengen min.
Et enkelt eksempel vil være en linje der jeg vil erstatte (10)
til {10}
, hvor 10 kan være hvilket som helst tall.
Jeg kom så langt
.s/([0-9]*)/what here??/
som stemmer overens med den delen jeg vil ha.
Nå erstatningen, jeg prøvde
.s/([0-9]*)/{\0}/
Men, dette gir som utgang {(10)}
Så prøvde jeg
.s/(\zs[0-9]*\ze)/{\0}/
Men det ga meg ({10})
, som jeg også lukker, men ikke hva jeg vil.
Jeg tror jeg trenger en annen merking / bakreferanse i stedet for denne \0
, men jeg vet ikke hvor jeg skal lete. Så spørsmålet er, kan dette gjøres i vim, en nd hvis ja, hvordan?
Svar
\0
er hele kampen. For å bruke bare en del av det, må du stille det slik og bruke \ 1
.s/(\([0-9]*\))/{\1}/
Mer detaljert instruksjon du kan finne her eller i vim-hjelp.
Kommentarer
- Legg merke til at parentesene for opptaket er unntatt skråstrek.
Svar
Jeg arvet nylig noen eldre koder og ønsket å erstatte alle forekomster som:
print "xx" print x,y print "xx"
til
logging.info("xy")
eller
logging.info(x,y)
Bygger på forrige svar og i håp om at noen vil ha nytte av det brukte jeg følgende kommando, som vil endre alle forekomster:
%s/print\( .*\)/logging.info\(\1\)/g
Hvis du erstatter %
med .
og fjern /g
du vil ende opp med
.s/print\( .*\)/logging.info\(\1\)
som gjør at du kan gå over hver kamp og velg om du endrer det eller ikke.
Svar
Bedre måte å gjøre det mulig for deg å gå over hver kamp er å legg til et «c» på slutten av koden, i stedet for å gå linje for linje
%s/print\( .*\)/logging.info\(\1\)/gc
Kommentarer
- Dette svarer egentlig ikke ' t på det opprinnelige spørsmålet