2012-04-26 11 views
28

Na przykład, mam kilka wartości ze wspólnym prefiksem i Postfix, takie jak:Czy w VIM można użyć funkcji Znajdź i zamień na łańcuchu znaków wieloznacznych?

fooVal1Bar; 

fooVal2Bar; 

fooVal3Bar; 

W tym przypadku, wszystkie nazwy zmiennych zaczynają się i kończą foo i kończą Bar. Chcę użyć wyszukiwania i zamiany przy użyciu nazw zmiennych losowych znalezionych między foo i Bar. Załóżmy, że zmienne są już zdefiniowane: Val1, Val2, Val3 i Val1Old, Val2Old i . Chciałbym zrobić znaleźć zastąpić, coś wzdłuż linii:

:%s/foo<AnyString>Bar/foo<AnyString>Bar = <AnyString> + <AnyString>Old 

Spowodowałoby:

fooVal1Bar = Val1 + Val1Old; 

fooVal2Bar = Val2 + Val2Old; 

fooVal3Bar = Val3 + Val3Old; 

Mam nadzieję, że to jasne, co chcę zrobić, nie mogłem znaleźć nic vim help lub online o zastępowaniu ciągami znaków wieloznacznych. Najbardziej mogłem znaleźć o wyszukiwaniu ciągów znaków wieloznacznych.

Odpowiedz

41

wierzę chcesz

:%s/foo\(\w\+\)Bar/& = \1 + \1\Old/ 

wyjaśnienie:

\w\+ znajdzie jeden lub więcej wystąpień znaku. Poprzedzające znaki foo i następujące po Bar zapewniają, że te dopasowane znaki są po prostu pomiędzy wartościami foo i Bar.

\(...\) przechowuje te znaki, aby mogły być użyte w zastępującej części podstawienia.

& egzemplarzy, co zostało dopasowane

\1 jest ciąg schwytany w \(....\) części.

+0

jest jakaś różnica między \ W \ + i *.? – dwcanillas

+7

'\ w \ +' dopasowuje jeden lub więcej w tym zestawie: a-zA-Z0-9_ i '. *' Dopasowuje zero lub więcej cokolwiek. – gpojd

+0

Ah ok. To ma sens. Dzięki! – dwcanillas

2

Musisz uchwycić to, co chcesz zapisać. Spróbuj czegoś takiego:

%s/\(foo\(\w\+\)Bar\);/\1 = \2 \2Old/ 

Albo można go oczyścić trochę z magic:

%s/\v(foo(\w+)Bar);/\1 = \2 \2Old/