我需要在每一行中用 string2 替换第二次出现的 string1 - vim

I need to replace the second occurrence of string1 by string2 on every line - vim

我知道在文件的每一行中多次出现 string1。我正在寻找用 string2 替换第二个的 shortest/quickest 方法。尽管 vim 是我的偏好,但任何方法都可以。

这是一种方法:

:%normal 0/string1^Mncgnstring2<CR>

细分:

  • :[range]normal <macro>[range]
  • 中的每一行执行正常模式 <macro>
  • % 是范围 [<first line>,<last line>] 的 shorthand,它涵盖缓冲区中的每一行,
  • 0是我们宏的第一条命令,它把光标放在行的第一列,这是一个好习惯,
  • /string1^M 将光标移动到 string1 的第一个匹配项,^M 是用 <C-v><CR>、[=44= 获得的文字 <CR> ]
  • n 将光标移动到下一个匹配项,
  • cgnstring2 将当前匹配更改为 string2

参见 :help :range:help :normal:help gn


但如果能看到您尝试的内容并修复它,而不是为您提供可行的解决方案,会更有趣。

您可以使用 \zs 找到第二次出现的“string1”。

基于 :h \zs 示例,它将是

:%s/\(.\{-}\zsstring1\)\{2}/string2

在Vim命令模式下使用外部sed会更直接

:%!sed 's/string1/string2/2'

请参阅 https://vi.stackexchange.com/questions/8621/substitute-second-occurence-on-line 了解更多实现方法。