vim 全局命令仅第一次出现

vim 全局命令仅第一次出现

我想知道是否可以在 vim 中使用 :g 命令来仅匹配搜索结果的第一次出现。

我有一个文件,内容如下

Match 01
    stuff 01
    stuff 02
    stuff 03
Match 01
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

我正在尝试执行以下命令来提取数据

:g/Match 02/.,$w! /tmp/TESTING.txt

因此它使用全局命令,然后从当前行到文档末尾写入 /tmp/TESTING.txt

但当前行始终是匹配的最后一次出现,所以我最终得到

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

代替

Match 02
    stuff 01
    stuff 02
    stuff 03
Match 02
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03
Match 03
    stuff 01
    stuff 02
    stuff 03

这就是我想要的。我想知道是否可以让全局命令仅转到匹配项的第一次出现来解决此问题。

答案1

听起来你的问题是光标最终位于第一个匹配项的下方;我的建议是告诉 vim 将光标移动到第 1 行,然后执行范围/写入:

:1 | /Match 02/,$w! /tmp/TESTING.txt

我删除了句点,因为在我看来,您想要将一个范围写入文件,并且该范围定义为搜索“Match 02”直到$文件末尾。

参考:

答案2

这似乎对我有用。你的咒语的问题似乎是全局匹配曾是匹配后一个匹配(因为它是全局的):

0;/Match 02/;,$w! file

答案3

Global 为每个匹配执行命令,因此实际写入文件的内容是.,$来自第一个匹配,然后.,$是第二个匹配(等等)。这可以通过附加到输出文件而不是破坏每个匹配的内容来观察。

:g/Match 02/.,$w >> TESTING

宏可能更合适;类型

qa1G/Match 02
:.,$w! TESTING
q

上面的换行符是您需要混合返回键的地方。然后输入:reg a,这应该看起来像

:reg a
--- Registers ---
"a   1G/Match 02^M:.,$w! TESTING^M

并可以通过键入来播放@a

相关内容