【问题标题】:Delete all text in line before/after highlighted search pattern删除突出显示的搜索模式之前/之后的所有文本
【发布时间】:2011-06-03 09:30:21
【问题描述】:

我知道在 VIM 中如何搜索字符串并删除文本直到行首/行尾,但我想知道是否也可以在突出显示的搜索模式之前或之后删除行中的所有文本。

【问题讨论】:

    标签: search vim


    【解决方案1】:

    如果您想在所有行中执行此操作并且不想重新输入您的搜索词,我建议您执行以下操作:

    :%s/.*\ze<Ctrl-r>///
    

    这是做什么的:

    • %s/:替换文件中的所有行
    • .*:匹配任意字符
    • \ze:结束匹配,因此模式的其余部分不会被替换
    • &lt;Ctrl-r&gt;/:从“/”寄存器(即搜索寄存器)插入文本
    • //: 替换为空

    编辑:忘记了后面的部分。我建议同时删除两者:

    :%s/.*<Ctrl-r>/.*/<Ctrl-r>//
    

    【讨论】:

    • 谢谢兰迪。您的代码 :%s/.*\ze&lt;Ctrl-r&gt;/// 工作正常。你知道如果一行有2个匹配怎么办,如何选择第一个匹配或最后一个匹配?
    • 如果只有两个匹配项并且您只想更改到第一个匹配项,您可以将 '.*' 更改为 '.\{-}' 将匹配项更改为非贪婪的。如果您想删除两个匹配项之间的文本,那么您可能必须对正则表达式进行一些重大更改。
    【解决方案2】:

    删除同一行 FOO 之前的文本:

    :s/^.*\(FOO\)/\1/

    【讨论】:

    • 模式后如何删除所有内容?
    • 应该是:s/\(FOO\).*$/\1/。 ( 必须转义。
    【解决方案3】:

    从行首到突出显示的搜索模式的开头:0dn

    从突出显示的搜索模式末尾到行尾:$N//e&lt;Enter&gt;lD

    这些在大多数情况下都有效。

    【讨论】:

    • 谢谢您,您知道如何将其放入所有行的命令中吗?
    • @Remonn:你可以把它放在一个递归宏中并像下面这样执行它:ggqqqqq//b&lt;Enter&gt;$N//e&lt;Enter&gt;lD&lt;Enter&gt;0@qq@q。但同样,太简单了,无法在所有情况下工作;在某些极端情况下会达不到要求。 @Randy Morris 的答案包含 设计 的工作方式,因此如果您想对多行而不是单个特定行执行更改,您肯定会想要使用它。跨度>
    【解决方案4】:

    我无法评论其他答案,所以我在这里回答,但我指的是xofon的回答: 只需在命令行中添加一个 '%' 即可,这将适用于文件中的所有行。

    删除所有行中']'之后的所有字符

    :%s/\(\]\).*$/\1/
    

    删除文件中所有行中'-'之前的所有字符

    :%s/^\( -- \).*/\1/
    

    【讨论】:

      【解决方案5】:

      要在搜索匹配之前和之后删除行中的所有文本,您也可以这样做:

      :g//norm gnd0PlD
      

      这会在与最后一个搜索模式匹配的所有行上执行正常模式命令。命令是gn 选择匹配,d 删除它,0P 将其粘贴到行首,l 向左移动(在刚刚粘贴的文本之后)和@ 987654326@ 删除直到行尾。我知道gn 是最近添加到 vim 的,所以 YMMV。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 2021-02-13
        • 2018-01-09
        相关资源
        最近更新 更多