【问题标题】:Vim substitution with multiple pattern with OR operator and visual mode selected text使用 OR 运算符和可视模式选择文本的多种模式的 Vim 替换
【发布时间】:2020-04-27 14:35:41
【问题描述】:

我有:

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\1:e |  s:dw\([2-4]\):dw1\1: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”?

【问题讨论】:

  • 我认为您需要将 g 标志添加到替换中
  • StackOverflow 致力于帮助解决编程代码问题。您的 Q 似乎更适合 Super UserVi and Vim ,但请阅读他们关于主题问题的帮助部分。并且请先阅读Help On-topicHelp How-to-ask,然后再在此处发布更多问题。祝你好运。

标签: vim sed replace substitution


【解决方案1】:

通过交替运算符使用嵌套分组

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

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

我在替换字符串中仅引用子表达式组 \1\4

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

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


如何正确引用子表达式组

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

:help pattern 中提到了这一点。


这是该命令的前后对比:

之后:

【讨论】:

  • 感谢您的解决方案。只是一个问题:为什么当我们使用\4 而不是\3 打印时,模式\([2-4]\) 被视为第4 组,即我不明白为什么它不是第3 组,所以我们宁愿写:'&lt;,'&gt;s/\(\(up\)\|\(dw\)\)\([2-4]\)/\11\3/ge .顺便说一句,最后的标志e 代表什么?问候
  • @youpilat13 我更新了答案以回答您关于引用子表达式(组)的问题。
【解决方案2】:

在您的特定情况下,条目都与同一列对齐并且您希望对所有条目应用相同的修改(“插入 1”),您也可以使用可视块模式来完成此任务。

执行以下命令序列:

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

【讨论】:

    【解决方案3】:

    我的尝试:

    :%s/\v(up|dw)/\11/g
    
    \v .................... very magic
    (up|dw) ............... up or dw
    \1 .................... reinserts the regex group
    1  .................... here our desired 1
    

    【讨论】:

    • 魔法确实让它看起来干净整洁。
    猜你喜欢
    • 2016-11-17
    • 2019-01-04
    • 1970-01-01
    • 2015-05-28
    • 2011-11-16
    • 1970-01-01
    • 2013-09-18
    • 2019-05-23
    • 2019-04-24
    相关资源
    最近更新 更多