Jeg arbejder med VIm
og forsøger at oprette en søg og erstat kommando for at udføre nogle udskiftninger, hvor jeg kan genbruge det regulære udtryk, der er en del af min søgestreng.
Et simpelt eksempel ville være en linje, hvor jeg vil erstatte (10)
til {10}
, hvor 10 kan være et hvilket som helst tal.
Jeg kom så langt
.s/([0-9]*)/what here??/
der matcher nøjagtigt den del, jeg vil have.
Nu erstatningen, jeg prøvede
.s/([0-9]*)/{\0}/
Men, dette giver som output {(10)}
Så prøvede jeg
.s/(\zs[0-9]*\ze)/{\0}/
Men det gav mig ({10})
, som jeg også lukker, men ikke hvad jeg vil.
Jeg tror, jeg har brug for en anden form for markering / back-referencer i stedet for denne \0
, men jeg ved ikke, hvor jeg skal kigge. Så spørgsmålet er, kan dette gøres i vim, en nd hvis ja, hvordan?
Svar
\0
er hele matchet. For kun at bruge en del af det skal du indstille det sådan og bruge \ 1
.s/(\([0-9]*\))/{\1}/
Mere detaljeret instruktion, du kan finde her eller i vim-hjælp.
Kommentarer
- Bemærk, at parenteserne til optagelsen er undtaget fra skråstreg.
Svar
Jeg arvede for nylig en ældre kode, og jeg ville erstatte alle forekomster som:
print "xx" print x,y print "xx"
til
logging.info("xy")
eller
logging.info(x,y)
Bygger på det forrige svar og i håb om, at nogen vil få gavn af det, brugte jeg følgende kommando, der vil ændre alle forekomster:
%s/print\( .*\)/logging.info\(\1\)/g
Hvis du erstatter %
med .
og fjern /g
du ender med
.s/print\( .*\)/logging.info\(\1\)
der gør det muligt for dig at gå over hvert match og vælg, om du ændrer det eller ej.
Svar
Bedre måde at gøre det muligt for dig at gå gennem hver kamp er at tilføj et “c” i slutningen af koden i stedet for at gå linje for linje
%s/print\( .*\)/logging.info\(\1\)/gc
Kommentarer
- Dette svarer virkelig ikke ' t det originale spørgsmål på nogen måde