Vim 使用 OR 运算符和可视模式选定文本的多个模式替换

Vim substitution with multiple pattern with OR operator and visual mode selected text

我有:

RT_T_up2 = CubicSpline(z_alot, RT_tab_up2)
RT_T_dw2 = CubicSpline(z_alot, RT_tab_dw2)
RT_T_up3 = CubicSpline(z_alot, RT_tab_up3)
RT_T_dw3 = CubicSpline(z_alot, RT_tab_dw3)
RT_T_up4 = CubicSpline(z_alot, RT_tab_up4)
RT_T_dw4 = CubicSpline(z_alot, RT_tab_dw4)

我想在 up 和 dw 前面加一个“1”,即:

RT_T_up12 = CubicSpline(z_alot, RT_tab_up12)
RT_T_dw12 = CubicSpline(z_alot, RT_tab_dw12)
RT_T_up13 = CubicSpline(z_alot, RT_tab_up13)
RT_T_dw13 = CubicSpline(z_alot, RT_tab_dw13)
RT_T_up14 = CubicSpline(z_alot, RT_tab_up14)
RT_T_dw14 = CubicSpline(z_alot, RT_tab_dw14)

原文用可视化模式选成vim。

我试过:

:'<,'>s:up\([2-4]\):up1:e |  s:dw\([2-4]\):dw1:e

但它仅通过给出 :

替换第一个 up
RT_T_up12 = CubicSpline(z_alot, RT_tab_up2)
RT_T_dw2 = CubicSpline(z_alot, RT_tab_dw2)
RT_T_up13 = CubicSpline(z_alot, RT_tab_up3)
RT_T_dw3 = CubicSpline(z_alot, RT_tab_dw3)
RT_T_up14 = CubicSpline(z_alot, RT_tab_up4)
RT_T_dw4 = CubicSpline(z_alot, RT_tab_dw4)

如何在每个 updw 模式之后插入一个“1”?

使用交替运算符进行嵌套分组

我为 updw 创建了子表达式组,并将它们与交替运算符 \| 嵌套在一起。

正如@wobr 所指出的,使用 g 标志对给定行上的所有事件执行替换。您可以在此处阅读有关替换标志的信息,:help :s_flags

我在替换字符串中仅引用子表达式组 </code> 和 <code>

'<,'>s/\(\(up\)\|\(dw\)\)\([2-4]\)//ge

e 标志只是防止搜索模式失败时出现错误消息。大多数人不介意错误信息。


如何正确引用子表达式组

在你的模式中从左到右,计算起始括号,(。计数将是子表达式的引用编号:

这在 :help pattern 中有所提及。


这是此命令的前后对比:

之后:

在您的特定情况下,如果条目全部对齐到同一列并且您想对所有条目应用相同的修改 ("insert 1"),您也可以使用可视块模式来完成此操作任务。

执行以下命令序列:

  • f2: 移动光标到第一行字符2
  • <C-V>: 进入可视块模式。
  • 5j:将选区扩展到接下来的5行,覆盖所有要修改的条目。
  • I1<Esc>:在可视块前插入“1”。当您按下 Escape 键时,所有其他行将收到相同的修改。
  • 2f2: 将光标移动到第一行的最后一个“2”。
  • .:重复。这将在您现在所在的列中再次插入“1”,行数相同。

我的尝试:

:%s/\v(up|dw)//g

\v .................... very magic
(up|dw) ............... up or dw
 .................... reinserts the regex group
1  .................... here our desired 1