我想知道是否可以在 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