Могу ли я заставить: работать только на последнем совпадении линии?

16

:s/pattern/replacementдействует на первый матч и :s/pattern/replacement/gна все.

Как оперировать только на последнем?

Toothrot
источник

Ответы:

18

я хотел бы использовать \zs

:%s/.*\zspattern/replacement/

Немного объяснения:

  • . представляет любой отдельный символ
  • * представляет жадное сопоставление (как можно больше)

В Vim вы можете использовать якоря нулевой ширины \zsи \zeопределять начало и конец искомого шаблона, которому вы хотите соответствовать. Ничто до \zsи после \zeв вашем шаблоне не будет затронуто заменой.

Для того, чтобы сделать его легко понять, я хотел бы использовать этот пример из викия «s Поиск и замена :

Сохраните ввод с помощью \zsи, \zeчтобы установить начало и конец шаблона. Например, вместо:

:s/Copyright 2007 All Rights Reserved/Copyright 2008 All Rights Reserved/ 

Использование:

:s/Copyright \zs2007\ze All Rights Reserved/2008/

Для получения дополнительной информации посмотрите на

ryuichiro
источник
Можете ли вы дать базовое описание того, что \zsговорится в вашем ответе?
EvergreenTree
3
Стоит отметить, что причина , по которой это работает, в том, что .*он жадный .
Уайлдкарт
7

Вы можете искать последнее совпадение, группируя все \(.*\), но последнее вхождение pattern. Затем выход с захваченной группой \1и добавление replacement.

:%s/\(.*\)pattern/\1replacement/
bolichep
источник
(Это хуже, чем решение @ ryuichiro \zs, в том смысле , что ваш \1подход функционально эквивалентен, но более многословен. (С другой стороны, некоторые из них могут быть легче запомнить, особенно если они используются в других вариантах регулярных выражений.))
Аарон Тома
0

Ради полноты я думал, что выложу альтернативу. В Vim есть несколько элементов, некоторые из которых аналогичны более стандартным регулярным выражениям с обходными утверждениями (отрицательный / положительный взгляд / взгляд назад). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

В этом случае нам нужен негативный взгляд, то \@!есть мы хотим утверждать, что атом , предшествующий элементу, не встречается после паттерна . В этом случае атом является шаблоном, которому предшествует что-либо еще:

:%s/pattern\(.*pattern\)\@!/replacement/

Часть внутри круглых скобок имеет нулевую ширину и не включена в совпадение, поэтому не заменяется заменой.

:h \@!для получения дополнительной информации или :h pattern-multi-itemsдля всего раздела, содержащего другие варианты поиска.

B слой
источник