【问题标题】:Delete anything other than pattern删除除图案以外的任何内容
【发布时间】:2011-06-06 07:59:39
【问题描述】:

假设这是我的文字:

这是我的文字 this
这是我的文字这是我的文字
我的文字是这样的

我想突出显示除图案以外的所有文本并删除突出显示的文本。
体育text:一定是这个结果。

文字
文本文本
文字

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

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

谁能帮帮我?

【问题讨论】:

标签: search vim


【解决方案1】:

试试这个:

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

【讨论】:

  • 我试图将你的代码:%s/\(^\|\(text\)\@&lt;=\).\{-}\($\|text\)\@=//g 放在 menu.vim 中,你知道为什么这在命令行上有效,但在 menu.vim(或 vimrc)中无效。我必须使用双反斜杠或类似的东西吗?
  • @Remonn:这些文件是在加载文件之前读取的。尝试设置自动命令或发出命令。
  • 我在 menu.vim 中创建了这个命令:nnoremenu &lt;silent&gt; 96.061.11 &amp;Matches.Delete\ all\ but\ Matches\ :%s/\(^\|\(&lt;C-r&gt;/\)\@&lt;=\).\{-}\($\|&lt;C-r&gt;/\)\@=//g&lt;CR&gt; 这给出了没有找到的错误,当我在“text”中更改 / 时同样的错误
  • 你必须逃离管道 (\| => \\|)。
  • 使用非常神奇的命令并将命令分解为搜索和替换,更容易理解 - Search /\v(^|(text)@&lt;=).{-}($|text)@= Substituition :%s,,\1,g
【解决方案2】:

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

:v/pattern/d

【讨论】:

  • 这会删除整行而不突出显示,并保持整行突出显示而不仅仅是突出显示的文本。
  • 确实如此。因此,虽然这个答案并不能真正解决最初的问题,但我发现 :v 命令非常非常有用。
【解决方案3】:

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

OP 的例子是

:%DeleteExcept /text/

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

【讨论】:

  • 致反对者:如果您有建设性的反馈,请在此处发布,或直接与我联系。
  • 请添加该命令的使用示例。目前,还没有办法了解它是如何工作的。
  • @RohanGhige 感谢您的反馈;我添加了一个例子。对我来说,语法似乎很简单,但你是对的,不能指望读者会这样,并不是每个人都会点击进入插件页面。
猜你喜欢
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多