如何仅在vim中替换第一次出现

时间:2016-01-19 09:39:26

标签: vim vi greedy regex-greedy boost-regex

是否有任何选项可以替换第一次出现而不要求在vim中进行确认?

我想在第一次出现时用\place{New York}取代纽约而不要求确认。我用了这段代码:

silent! /\\begin{text}/,/\\end{textit}/s/New York/\\place{New York}/g

> \begin{text}..[paragraphs]...\end{textit}

New York可能会在段落中包含10次。

2 个答案:

答案 0 :(得分:2)

替换结束时的/g标记意味着它将在每次出现搜索模式时执行。取下它,它只会在第一次出现时执行。

此外,:s默认情况下不会要求确认;你需要为此添加/c标志。所以我不确定你为什么用:silent作为前缀。

另一条评论:您可以使用&

重复使用替换部分中的匹配文字
:/\\begin{text}/,/\\end{textit}/s/New York/\\place{&}

答案 1 :(得分:2)

所以你想在一个行范围内只进行一次替换,而不是每行一次。所以/start/,/end/ s/pat/rep/将不起作用。鉴于我们有:

,我会让你的例子更简单
foo
nyc nyc
nyc nyc
bar

我想你期待的是

foo
\\place{nyc} nyc
nyc nyc
bar

但是:/foo/,/bar/ s/nyc/\\place{&}会给出

foo
\\place{nyc} nyc
\\place{nyc} nyc
bar

因为:s会为范围内的每一行做sub。

我会缩小范围来解决这个问题:

/foo//nyc/s/nyc/\\place{&}/

请注意,在/foo/ and /nyc/之间,没有逗号。

输出应为:

foo
\\place{nyc} nyc
nyc nyc
bar

您可能需要阅读:h range了解详情。