【问题标题】:VIM Search/Replace spaces between 2 brackets or columnsVIM 搜索/替换 2 个括号或列之间的空格
【发布时间】:2010-03-30 21:00:43
【问题描述】:

鉴于以下行:

[aaaa bbbb cccc dddd] [decimal](18, 0) NULL,

如何仅替换 Vim 中第一组括号之间的空格? /s 命令会是什么样子?

更新:

这是预期的结果

    [aaaa_bbbb_cccc_dddd] [decimal](18, 0) NULL,

【问题讨论】:

    标签: regex vim replace


    【解决方案1】:

    最简单的方法是直观地选择[]ed 字符串的内容并仅在该选择上执行替换:

    vi]:s/\%V \%V/_/g
    

    但是,如果您尝试以编程方式执行操作,则此方法效果不佳。在这种情况下,您可以匹配整个[]ed 字符串并使用replacement expression 来构造结果。

    :s/\[[^\]]*\]/\=substitute(submatch(0), ' ', '_', 'g')/g
    

    【讨论】:

    • 替换表达式很酷。我最好的方法是替换第一个空格,然后按 & 直到它告诉你它找不到模式
    • =substitute(submatch(0)... 是我需要的。谢谢!
    【解决方案2】:

    使用你想做的“魔法”的正常设置

    :s/] \[/][/
    

    或者更花哨

    :s/]\zs\s\+\ze\[//
    

    或者在正则表达式中明确设置魔法级别

    :s/\V]\zs\s\+\ze[//
    

    \zs 和 \ze 将替换限制在它们所包围的区域内。

    \M 完全关闭魔法,因此每个不以\ 为前缀的字符或字符组合都是按字面意思理解的。

    'magic' (:help 'magic') 是一个全局选项,用于确定如何解释正则表达式中的潜在特殊字符。

    【讨论】:

    • 您忘记了后视和前瞻 (s/]\@<=\s\+\[\@=//)。
    • \V 使除\ 之外的所有内容都按字面意思解释。 \M\V 和默认设置之间的一步。更改'magic' 的值只是自找麻烦。
    • @jamessan 哎呀,谢谢。固定的。 @ZyX \zs & \ze 更容易记住,我想得更快,所以我更喜欢尽可能使用它们。阅读更新后,我发现我的答案完全不是问题的答案。
    【解决方案3】:

    您始终可以进行交互式查找和替换,这可以通过标志 c 完成

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 2013-08-11
      • 2021-03-05
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2015-01-09
      • 2014-10-31
      • 2015-02-06
      相关资源
      最近更新 更多