Ik werk met VIm
en probeer een zoek en vervang opdracht om een aantal vervangingen uit te voeren waarbij ik de reguliere expressie die deel uitmaakt van mijn zoekreeks kan hergebruiken.
Een eenvoudig voorbeeld is een regel waarin ik tot {10}
, waarbij 10 elk getal kan zijn.
Ik ben zo ver gekomen
.s/([0-9]*)/what here??/
wat precies overeenkomt met het onderdeel dat ik wil.
Nu de vervanging, heb ik geprobeerd
.s/([0-9]*)/{\0}/
Maar, dit geeft als uitvoer {(10)}
Toen probeerde ik
.s/(\zs[0-9]*\ze)/{\0}/
Dat gaf echter me ({10})
, die ik ook afsluit, maar niet wat ik wil.
Ik denk dat ik een ander soort markering / back-referencing nodig heb in plaats van deze \0
, maar ik weet niet waar ik moet zoeken. De vraag is dus: kan dit in vim, een en zo ja, hoe?
Antwoord
\0
is de hele overeenkomst. Om slechts een deel ervan te gebruiken, moet u het zo instellen en \ 1
.s/(\([0-9]*\))/{\1}/
gebruiken Meer gedetailleerde instructies vindt u hier of in vim help.
Reacties
- Let op: de haakjes voor de opname zijn backslash-escaped.
Answer
Ik heb onlangs een aantal oude code geërfd en ik wilde alle voorvallen vervangen, zoals:
print "xx" print x,y print "xx"
tot
logging.info("xy")
of
logging.info(x,y)
Voortbouwend op het vorige antwoord en in de hoop dat iemand er baat bij heeft, gebruikte ik de volgende opdracht, die alle exemplaren zal veranderen:
%s/print\( .*\)/logging.info\(\1\)/g
Als u %
vervangt door .
en verwijder /g
je zult eindigen met
.s/print\( .*\)/logging.info\(\1\)
waarmee je ga over elke match en kies of je deze wel of niet wijzigt.
Answer
Een betere manier om je in staat te stellen elke match te bespreken, is door voeg een “c” toe aan het einde van de code, in plaats van regel voor regel te gaan
%s/print\( .*\)/logging.info\(\1\)/gc
Reacties
- Dit ' beantwoordt de oorspronkelijke vraag op geen enkele manier