我需要在每一行中用 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 了解更多实现方法。
我知道在文件的每一行中多次出现 string1。我正在寻找用 string2 替换第二个的 shortest/quickest 方法。尽管 vim 是我的偏好,但任何方法都可以。
这是一种方法:
:%normal 0/string1^Mncgnstring2<CR>
细分:
:[range]normal <macro>
在[range]
、 中的每一行执行正常模式 %
是范围[<first line>,<last line>]
的 shorthand,它涵盖缓冲区中的每一行,0
是我们宏的第一条命令,它把光标放在行的第一列,这是一个好习惯,/string1^M
将光标移动到string1
的第一个匹配项,^M
是用<C-v><CR>
、[=44= 获得的文字<CR>
]n
将光标移动到下一个匹配项,cgnstring2
将当前匹配更改为string2
。
<macro>
参见 :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 了解更多实现方法。