Byt ut med VIM, återanvänd en del av sökmönstret

Jag jobbar med VIm och försöker skapa en Sök och ersätt kommandot för att göra några ersättningar där jag kan återanvända det reguljära uttrycket som ingår i min söksträng.

Ett enkelt exempel skulle vara en rad där jag vill ersätta (10) till {10}, där 10 kan vara vilket nummer som helst.

Jag kom så långt

 .s/([0-9]*)/what here??/ 

som matchar exakt den del som jag vill ha.

Nu har jag ersatt det, jag försökte

 .s/([0-9]*)/{\0}/ 

Men, detta ger som utgång {(10)}

Sedan försökte jag

 .s/(\zs[0-9]*\ze)/{\0}/ 

Men det gav mig ({10}), som jag också stänger, men inte vad jag vill.

Jag tror att jag behöver någon annan typ av markering / bakreferens istället för den här \0, men jag vet inte vart jag ska leta. Så frågan är, kan detta göras i vim, en och i så fall, hur?

Svar

\0 är hela matchningen. För att bara använda en del av det måste du ställa in det så här och använda \ 1

.s/(\([0-9]*\))/{\1}/ 

Mer detaljerad instruktion du hittar här eller i vim-hjälp.

Kommentarer

  • Observera att parenteserna för inspelningen är underskridande snedstreck.

Svar

Jag ärvde nyligen en äldre kod och jag ville ersätta alla förekomster som:

print "xx" print x,y print "xx" 

till

logging.info("xy") 

eller

logging.info(x,y) 

Bygga på föregående svar och i hopp om att någon skulle dra nytta av det använde jag följande kommando, som kommer att ändra alla förekomster:

%s/print\( .*\)/logging.info\(\1\)/g 

Om du ersätter % med . och ta bort /g kommer du att sluta med

.s/print\( .*\)/logging.info\(\1\) 

som gör att du kan gå över varje match och välj om du ändrar den eller inte.

Svar

Ett bättre sätt att göra det möjligt för dig att gå igenom varje match är att lägg till ett ”c” i slutet av koden, snarare än att gå rad för rad

%s/print\( .*\)/logging.info\(\1\)/gc 

Kommentarer

  • Detta svarar verkligen inte ' på den ursprungliga frågan på något sätt

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *