Чи можу я змусити: s діяти лише на останньому матчі рядка?


16

:s/pattern/replacementдіє на перший матч і :s/pattern/replacement/gна всіх.

Як діяти лише на останньому?

Відповіді:


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/

Для отримання додаткової інформації дивіться


Чи можете ви надати основний опис того, що \zsстосується вашої відповіді?
EvergreenTree

3
Варто зазначити, що причина цього працює в тому .*, що жадібна .
Wildcard

7

Ви можете шукати останній збіг, згрупувавши всі \(.*\), але останні останні pattern. Потім виходимо із захопленої групи \1та додаємо replacement.

:%s/\(.*\)pattern/\1replacement/

(Це поступається рішенню @ ryuichiro тим \zs, що ваш \1підхід є функціонально еквівалентним, але більш багатослівним. (З іншого боку, деяким може бути легше запам'ятати, особливо, якщо вони використовуються для інших ароматів регулярних виразів.))
Аарон Тома

0

Для повноти я подумав, що опублікую альтернативу. Vim має кілька елементів, деякі з яких схожі на більш стандартні твердження про регулярне висловлення (негативні / позитивні підказки / дивлячись позаду ). /programming/2973436/regex-lookahead-lookbehind-and-atomic-groups

У цьому випадку ми хочемо негативної пошуку \@!, тобто ми хочемо стверджувати, що атом, який передує елементу, не виникає після шаблону . У цьому випадку атом є самим шаблоном, якому передує все інше:

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

Частина всередині дужок є нульовою шириною і не включається в збіг, тому не замінюється заміною.

:h \@!для отримання додаткової інформації або :h pattern-multi-itemsдля цілого розділу, що містить інші варіанти пошуку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.