Відповіді:
Я б користувався \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стосується вашої відповіді?