2013-04-22 9 views
5

Say mam linie tak:wyszukiwanie i zastąpić bez zużywania co szukasz

'alpha' 123 
'beta' 678 
'alpha' 998 
'gamma' 212 

i używając wyszukiwania & wymienić regex w VIM, przekształcić go w ten sposób:

'alpha' 123 : alpha 
'beta' 678 : beta 
'alpha' 998 : alpha 
'gamma' 212 : gamma 

Zasadniczo , wyszukiwanie nie zastąpi tego, czego szuka, ale zamiast tego po prostu używa go do czegoś innego. W mojej głowie powinno to zadziałać:

:g/'\(.*\)'/s/$/: \1/g 

Ale to się nie udało. Jak nie konsumować tego, czego szukam, ale zachować je do użytku?

Odpowiedz

1

Można to zrobić bezpośrednio w komendzie zastępczego, używając \zs który naprawdę przydatna dla budowania rzeczy jak zerowej szerokości meczów (nie ma „spożywać”).

:%s/'\(.*\)'.*\zs/ : \1 

Znak \zs oznacza początek meczu. To jest jak "rozpoczęcie meczu tutaj ". Najpierw przechwytywana jest zawartość nawiasu, a następnie dodatkowy pasuje do wszystkiego aż do końca linii, a \zs resetuje teraz dopasowanie do tego punktu, co oznacza, że ​​wcale nie jest częścią meczu, ale zawartość parens zostały schwytane.

Część zastępująca zastępuje koniec linii z : i dopasowaną grupą.

:h \zs

+1

To jest exac na co liczyłem! Dzięki! – Bromide

0

Polecenie to powinno działać:

:%s/\v'(\w*)'.*/\0 : \1 

(dobrze, że tak tu z przykładowy tekst)

5

Początkowy g na mecz nie uchwycić na wymianę; służy tylko do grupowania w poszukiwaniu. Zamiast korzystać z tego, co jest trochę prostsza też:

%s/'\(.*\)'.*/& : \1/ 

& zastępuje wszystko, co zostało dopasowane.

+0

Używam wariantu z przykładu sidyll, ale to też jest dobre :-) – Bromide

0

prace makro na swoim przykładzie TOO: (nie testowałem w vim, ale powinien działać.)

kursor na początku 1. linia:

qqyi'A : <esc>pjq 

następnie [email protected] (x to ile razy chcesz zrobić)

Powiązane problemy