我是 vim 脚本编写新手,如何仅替换一次模式。我正在使用以下代码。
%s/^\\docume.*/\\docment\[STRING\]
Run Code Online (Sandbox Code Playgroud)
输入
\document{A}
\document{B}
\document{C}
\document{D}
Run Code Online (Sandbox Code Playgroud)
预期产出
\document{STRING}
\document{B}
\document{C}
\document{D}
Run Code Online (Sandbox Code Playgroud)
您%使用的 是要处理命令的行范围,在本例中意味着从第一行到最后一行(也可以写为:1,$s/regex/...)。
指定的地址也只能是一行,例如:
:3s/regex/.../仅在3号线运行:$s/regex/.../只在最后一行操作搜索也可以用作范围的一部分:
:/search/s/regex/replace/。然而,就像 /我们用来搜索文件一样,它会在当前光标位置之后开始搜索。如果您想匹配文件的第一次出现,您可以创建移动到第 0 行(第 1 行之前),然后进行搜索。它会找到第一个出现的位置,即使是在第 1 行中。因此,您的问题的答案是使用一个范围(即使它只会匹配该范围中的一行)。
但最终答案是否定的:0,/search/。不会,移动光标,因此会将第 0 行匹配到光标位置之后的第一个搜索查找。如果您想在范围内移动光标,请使用 ;
。
另一个小技巧:将范围中的搜索重用为替换中的搜索,将后者留空。这给出了最终答案:
:0;/^\\document\zs.*/s//{STRING}
Run Code Online (Sandbox Code Playgroud)
换句话说:在第 0 行到模式的第一个匹配的范围内进行替换,将相同的模式替换为{STRING}(因此仅在一行中操作,即文件的最顶层匹配)。
请查看手册了解范围,以了解更多信息::h range