【问题标题】:I need to replace the second occurrence of string1 by string2 on every line - vim我需要在每一行上用 string2 替换第二次出现的 string1 - vim
【发布时间】:2021-09-04 07:27:20
【问题描述】:

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

【问题讨论】:

标签: vim substitution


【解决方案1】:

您可以使用\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 了解更多实现方法。

【讨论】:

  • 谢谢叶子,您的 sed 建议正是我所需要的。去表明,对于每一个问题,都有一个工具可以做得最好。再次感谢。
【解决方案2】:

这是一种方法:

:%normal 0/string1^Mncgnstring2<CR>

细分:

  • :[range]normal &lt;macro&gt;[range] 的每一行上执行普通模式&lt;macro&gt;
  • % 是范围[&lt;first line&gt;,&lt;last line&gt;] 的简写,它涵盖了缓冲区中的每一行,
  • 0 是我们宏的第一个命令,它将光标放在行的第一列,这是一个好习惯,
  • /string1^M 将光标移动到string1 的第一个匹配项,^M 是通过&lt;C-v&gt;&lt;CR&gt; 获得的文字&lt;CR&gt;
  • n 将光标移动到下一个匹配项,
  • cgnstring2 将当前匹配更改为 string2

请参阅:help :range:help :normal:help gn


但是看看你尝试了什么并修复它会更有趣,而不是为你提供一个可行的解决方案。

【讨论】:

  • 感谢 romainl 的回答。您的命令不应该以 ESC 而不是 CR 结尾吗?由于某种原因,代码在命令行中直接使用时不起作用。但是当我将 0/string1|^Mcgnstring2^[aj (这是一个记录的宏)放入一个寄存器(比如 h)并从命令行以 :%norm @h 运行宏时,它就可以工作了很好。
  • 我在提交答案之前测试了它。
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 2012-06-16
  • 2020-10-08
  • 1970-01-01
相关资源
最近更新 更多