Удалить что-нибудь кроме шаблона - PullRequest
11 голосов
/ 06 июня 2011

Допустим, это мой текст:

это мой текст этот
мой текст это мой текст
мой текст такой

Я хотел бы выделить весь текст, кроме рисунка, и удалить выделенный текст.
pe text: это должен быть результат.

text
texttext
text

Я нашел код, как выделить весь текст, кроме шаблона:
\%(\%(.{-}\)\@!text\zs\)*

, однако я не знаю, как удалить весь выделенный текст.
Это нене работает:
:%s/\%(\%(.{-}\)\@!bell\zs\)*//

Кто-нибудь может мне помочь?

Ответы [ 3 ]

13 голосов
/ 06 июня 2011

Попробуйте это:

:%s/\(^\|\(text\)\@<=\).\{-}\($\|text\)\@=//g

Пояснение:

\(^\|\(text\)\@<=\)     # means start of line, or some point preceded by “text”
.\{-}                   # as few characters as possible
\($\|text\)\@=          # without globbing characters, checking that we reached either end of line or occurrence of “text”.

Еще один способ сделать это:

  • Создайте функцию, которая подсчитывает совпадения шаблона в строке (см. :help match(), чтобы помочь вам спроектировать это)
  • Использование: :%s/.*/\=repeat('text', matchcount('text', submatch(0)))
7 голосов
/ 06 июня 2011

Простите, потому что я не эксперт по vim, но не стал бы начинать поиск с помощью v найти обратное, чтобы вы могли сделать что-то подобное?

:v/pattern/d
4 голосов
/ 29 мая 2013

Я реализовал умное регулярное выражение Бенуа как собственную команду :DeleteExcept в моем плагине PatternsOnText .Он также предлагает другие связанные команды, такие как :SubstituteExcept или :SubstituteInSearch.

Примером OP будет

:%DeleteExcept /text/

Сравнивая это с явной командой @ Benoit (:%s/\(^\|\(text\)\@<=\).\{-}\($\|text\)\@=//g), этонамного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...