如何使用 vim 脚本仅替换一次模式

Kev*_*in 1 vim

我是 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)

sid*_*yll 5

%使用的 是要处理命令的行范围,在本例中意味着从第一行到最后一行(也可以写为: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