【发布时间】:2010-03-30 21:00:43
【问题描述】:
鉴于以下行:
[aaaa bbbb cccc dddd] [decimal](18, 0) NULL,
如何仅替换 Vim 中第一组括号之间的空格? /s 命令会是什么样子?
更新:
这是预期的结果
[aaaa_bbbb_cccc_dddd] [decimal](18, 0) NULL,
【问题讨论】:
鉴于以下行:
[aaaa bbbb cccc dddd] [decimal](18, 0) NULL,
如何仅替换 Vim 中第一组括号之间的空格? /s 命令会是什么样子?
更新:
这是预期的结果
[aaaa_bbbb_cccc_dddd] [decimal](18, 0) NULL,
【问题讨论】:
最简单的方法是直观地选择[]ed 字符串的内容并仅在该选择上执行替换:
vi]:s/\%V \%V/_/g
但是,如果您尝试以编程方式执行操作,则此方法效果不佳。在这种情况下,您可以匹配整个[]ed 字符串并使用replacement expression 来构造结果。
:s/\[[^\]]*\]/\=substitute(submatch(0), ' ', '_', 'g')/g
【讨论】:
使用你想做的“魔法”的正常设置
:s/] \[/][/
或者更花哨
:s/]\zs\s\+\ze\[//
或者在正则表达式中明确设置魔法级别
:s/\V]\zs\s\+\ze[//
\zs 和 \ze 将替换限制在它们所包围的区域内。
\M 完全关闭魔法,因此每个不以\ 为前缀的字符或字符组合都是按字面意思理解的。
'magic' (:help 'magic') 是一个全局选项,用于确定如何解释正则表达式中的潜在特殊字符。
【讨论】:
s/]\@<=\s\+\[\@=//)。
\V 使除\ 之外的所有内容都按字面意思解释。 \M 是\V 和默认设置之间的一步。更改'magic' 的值只是自找麻烦。
您始终可以进行交互式查找和替换,这可以通过标志 c 完成
【讨论】: