用vim中的第n个单词替换

Gau*_*nia 16 regex vim sed substitution

我看到了其他问题涉及找到第n次出现的单词/模式,但我找不到你如何实际替换vim中第n次出现的模式.有一种明显的方法可以对所有事件进行硬编码

:s/.*\(word\).*\(word\).*\(word\).*/.*\1.*\2.*newWord.*/g 
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Luc*_*tte 10

有关信息,

s/\%(\(pattern\).\{-}\)\{41}\zs\1/2/
Run Code Online (Sandbox Code Playgroud)

也可以取代第42次发生.但是,我更喜欢John Kugelman给出的更简单的解决方案 - 即使它不会限制在当前的路线上.

  • 它就像`\(`,但它告诉我们不要将括号匹配的内容绑定到`\ 1`.参见`:h/\%(`,IIRC (2认同)

Joh*_*ica 6

您可以使用多次搜索更简单地完成此操作.:s/pattern/repl/命令中的空模式表示替换最近的搜索结果.

:/word//word//word/ s//newWord/
or
:/word//word/ s/word/newWord/
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过执行多次重复此操作@:,甚至10@:可以多次重复该命令10次.

或者,如果我以交互方式这样做,我会做类似的事情:

3/word
:s//newWord/r
Run Code Online (Sandbox Code Playgroud)

这将在光标处找到第三次出现的单词,然后执行替换.

  • -1:如果所有单词都在同一行(这就是我认为OP的意思),这些都不适用于我.在这两个例子中,替换仍然发生在该行的第一个单词上. (7认同)

αғs*_*нιη 5

用REPLACE 替换每N 出现的PATTERN。

:%s/\(\zsPATTERN.\{-}\)\{N}/REPLACE/
Run Code Online (Sandbox Code Playgroud)