Bytt ut med VIM, bruk en del av søkemønsteret

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *