我是vim脚本的新手,我如何只替换一次模式。我使用以下代码。
%s/^\\docume.*/\\docment\[STRING\]
输入
\document{A}
\document{B}
\document{C}
\document{D}
预期输出
\document{STRING}
\document{B}
\document{C}
\document{D}
答案 0 :(得分:4)
您使用的<activity
android:name="com.example.MainActivity"
android:label="Main"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" >
</action>
</intent-filter>
是命令所在的行范围
处理,在这种情况下,它意味着从第一行到最后一行(可以
也写成%
)。
指定的地址也可以只有一行,如:
:1,$s/regex/...
仅在第3行中运作:3s/regex/.../
仅在最后一行操作搜索也可以用作范围的一部分:
:$s/regex/.../
。但是,就像我们使用的:/search/s/regex/replace/
一样
搜索文件,它将在当前光标后开始搜索
位置。如果要匹配文件的第一个匹配项,则可以
创建移动到第0行(第1行之前),然后执行搜索。它会
找到第一个出现,即使在第1行。所以答案你的
问题是使用范围(即使它只匹配一行
在那个范围内)。
但最终答案不是/
。 :0,/search/
不会移动你的
光标,以便将第0行与第一个搜索匹配,在光标后找到
位置。如果要将光标移动到范围内,请使用,
代替。
另一个小技巧:重新使用范围内的搜索作为搜索 替换,将后者留空。这给出了最终答案:
;
换句话说:在0行到第一个匹配的范围内做替换
模式,用:0;/^\\document\zs.*/s//{STRING}
代替相同的模式(因此运作
仅在一行中,文件的最顶部匹配。)
请查看范围手册,了解更多信息:{STRING}
答案 1 :(得分:1)
我认为没有任何体面的方法可以做到这一点。这就是我想到的:
如果您在替换命令之前未包含%
,则vim仅替换当前行中的第一个匹配项(通过将/g
添加到行中来替换行中的所有匹配项命令结束。
因此,您可以首先搜索表达式,这会使您第一次出现,然后执行替换(无%
)。
我尝试使用execute
命令(就像运行vim脚本一样),但它没有用!
:execute "/foo"|"s/foo/bar/"
但是在两个单独的execute
命令中运行它们确实有效。
我猜在execute
(因此,vim脚本)中搜索无法正常工作。如果您在脚本中找到任何其他方式可以将您带到第一次出现的行的开头(我希望您这样做),那么s/foo/bar
将只替换第一个。