Odpowiedzi:
użyłbym \zs
:%s/.*\zspattern/replacement/
Trochę wyjaśnienia:
.
reprezentuje dowolny pojedynczy znak*
reprezentuje chciwe dopasowanie (jak najwięcej)W Vimie możesz użyć kotwic o zerowej szerokości \zs
i \ze
zdefiniować początek i koniec szukanego wzoru, które chcesz dopasować. Zastąpienie nie wpłynie na nic przed \zs
i po \ze
twoim wzorze.
Aby ułatwić zrozumienie, chciałbym wykorzystać ten przykład od Wikii „s wyszukiwania i zamiany :
Zapisz pisanie, używając
\zs
i,\ze
aby ustawić początek i koniec wzoru. Na przykład zamiast::s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/
Posługiwać się:
:s/Copyright \zs2007\ze All Rights Reserved/2008/
Aby uzyskać więcej informacji, spójrz na
Możesz wyszukać ostatnie dopasowanie, grupując wszystkie \(.*\)
, ale ostatnie wystąpienie pattern
. Następnie wyjdź z przechwyconą grupą \1
i dodaj replacement
.
:%s/\(.*\)pattern/\1replacement/
\zs
rozwiązania @ ryuichiro , ponieważ twoje \1
podejście jest funkcjonalnie równoważne, ale bardziej szczegółowe. (Z drugiej strony może być łatwiejsze do zapamiętania dla niektórych, szczególnie jeśli są przyzwyczajeni do innych smaków regex.))
Dla kompletności pomyślałem, że opublikuję alternatywę. Vim ma wiele elementów, z których niektóre są podobne do bardziej standardowych stwierdzeń dotyczących wyrażeń regularnych (negatywne / pozytywne lookahead / lookbehind). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
W tym przypadku chcemy negatywnego spojrzenia w przód, \@!
co oznacza, że chcemy stwierdzić, że atom poprzedzający element nie występuje po wzorze . W tym przypadku atom jest samym wzorem poprzedzonym czymkolwiek innym:
:%s/pattern\(.*pattern\)\@!/replacement/
Część w nawiasach ma zerową szerokość i nie jest uwzględniona w dopasowaniu, więc nie jest zastępowana przez podstawienie.
:h \@!
aby uzyskać więcej informacji lub :h pattern-multi-items
dla całej sekcji zawierającej inne odmiany wyglądu.
\zs
zawiera twoja odpowiedź?