Відповіді:
Я б користувався \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/
Для отримання додаткової інформації дивіться
Ви можете шукати останній збіг, згрупувавши всі \(.*\)
, але останні останні pattern
. Потім виходимо із захопленої групи \1
та додаємо replacement
.
:%s/\(.*\)pattern/\1replacement/
\zs
, що ваш \1
підхід є функціонально еквівалентним, але більш багатослівним. (З іншого боку, деяким може бути легше запам'ятати, особливо, якщо вони використовуються для інших ароматів регулярних виразів.))
Для повноти я подумав, що опублікую альтернативу. Vim має кілька елементів, деякі з яких схожі на більш стандартні твердження про регулярне висловлення (негативні / позитивні підказки / дивлячись позаду ). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups
У цьому випадку ми хочемо негативної пошуку \@!
, тобто ми хочемо стверджувати, що атом, який передує елементу, не виникає після шаблону . У цьому випадку атом є самим шаблоном, якому передує все інше:
:%s/pattern\(.*pattern\)\@!/replacement/
Частина всередині дужок є нульовою шириною і не включається в збіг, тому не замінюється заміною.
:h \@!
для отримання додаткової інформації або :h pattern-multi-items
для цілого розділу, що містить інші варіанти пошуку.
\zs
стосується вашої відповіді?