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

Rem*_*man 12 vim search

让我们说这是我的文字:

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

我想突出显示除模式之外的所有文本并删除突出显示的文本.
pe text:这一定是结果.

文字
texttext
文本

我发现代码如何选择除pattern之外的所有文本:
\%(\%(.{-}\)\@!text\zs\)*

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

谁能帮我?

Ben*_*oit 13

试试这个:

:%s/\(^\|\(text\)\@<=\).\{-}\($\|text\)\@=//g
Run Code Online (Sandbox Code Playgroud)

说明:

\(^\|\(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”.
Run Code Online (Sandbox Code Playgroud)

另一种方法:

  • 创建一个计算字符串中模式匹配的函数(请参阅:help match()帮助您设计)
  • 使用: :%s/.*/\=repeat('text', matchcount('text', submatch(0)))


Chu*_*uck 7

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

:v/pattern/d
Run Code Online (Sandbox Code Playgroud)

  • 这将删除整行而不突出显示,并保持整行不突出显示突出显示的文本. (3认同)

Ing*_*kat 5

:DeleteExceptPatternsOnText 插件中实现了 Benoit 巧妙的正则表达式作为自定义命令。它也提供其他相关命令,例如:SubstituteExcept:SubstituteInSearch

OP的例子是

:%DeleteExcept /text/
Run Code Online (Sandbox Code Playgroud)

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