删除除模式以外的任何内容

时间:2011-06-06 07:59:40

标签: search vim

让我们说这是我的文字:

这是我的文字 是我的文字这是我的文字
我的文字就是这个

我想突出显示除模式以外的所有文字并删除突出显示的文字 体育text:这必须是结果。

文字
texttext
文字

我找到了代码如何选择除模式之外的所有文本:
\%(\%(.{-}\)\@!text\zs\)*

但我不知道如何删除所有突出显示的文字 这不起作用:
:%s/\%(\%(.{-}\)\@!bell\zs\)*//

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:13)

试试这个:

:%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)))

答案 1 :(得分:7)

请原谅我,因为我不是vim专家,但不会在v之前找到相反的搜索,以便你可以做这样的事情吗?

:v/pattern/d

答案 2 :(得分:4)

我在我的PatternsOnText plugin中将Benoit的聪明正则表达式实现为自定义:DeleteExcept命令。它还提供其他相关命令,如:SubstituteExcept:SubstituteInSearch

OP的例子是

:%DeleteExcept /text/

与@ Benoit的显式命令(:%s/\(^\|\(text\)\@<=\).\{-}\($\|text\)\@=//g)相比,它更简单。