Czy mogę sprawić, aby: s działał tylko na ostatnim meczu linii?

16

:s/pattern/replacementdziała na pierwszym meczu i :s/pattern/replacement/gna wszystkich.

Jak operować tylko na ostatnim?

Toothrot
źródło

Odpowiedzi:

18

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 \zsi \zezdefiniować początek i koniec szukanego wzoru, które chcesz dopasować. Zastąpienie nie wpłynie na nic przed \zsi po \zetwoim wzorze.

Aby ułatwić zrozumienie, chciałbym wykorzystać ten przykład od Wikii „s wyszukiwania i zamiany :

Zapisz pisanie, używając \zsi, \zeaby 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

ryuichiro
źródło
Czy możesz podać podstawowy opis tego, co \zszawiera twoja odpowiedź?
EvergreenTree,
3
Warto zauważyć, że powodem tego .*jest chciwość .
Wildcard,
7

Możesz wyszukać ostatnie dopasowanie, grupując wszystkie \(.*\), ale ostatnie wystąpienie pattern. Następnie wyjdź z przechwyconą grupą \1i dodaj replacement.

:%s/\(.*\)pattern/\1replacement/
bolichep
źródło
(Jest to gorsze od \zsrozwiązania @ ryuichiro , ponieważ twoje \1podejś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.))
Aaron Thoma
0

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-itemsdla całej sekcji zawierającej inne odmiany wyglądu.

Warstwa B.
źródło