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

How to replace first occurrence only in vim

在 vim 中是否有任何选项可以在不要求确认的情况下替换第一个匹配项?

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

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

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

New York可能在段落中出现10次。

替换末尾的 /g 标志意味着它将在搜索模式的 每次 出现时执行。删除它,它只会在第一次出现时执行。

此外,:s默认不要求确认;您需要为此添加 /c 标志。所以我不确定你为什么要在前面加上 :silent.

另一条评论:您可以在 &:

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

所以你想在一个行范围内只做一个替换,而不是每行一个子。所以 /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会为范围内的每一行做子。

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

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

注意/foo/ and /nyc/之间没有逗号

输出应该是:

foo
\place{nyc} nyc
nyc nyc
bar

您可能需要阅读 :h range 以了解详细信息。