vim:替换反向引用的字符

时间:2014-01-21 15:09:46

标签: regex vim

我想在vim中执行以下操作:我有一个字符串(最后有空格)和一行数字。我想创建一个C #define,其字符串为大写+前缀+下划线,数字(十六进制),最后是原始字符串作为注释。

例如,来自:

hw version 0

为:

#define MY_HW_VERSION (0x00) // hw version

到目前为止,我写了以下正则表达式:

s/^\(.*\) \(\d\+\)$/#define MY_\U\1\E (0x0\2)\/\/ \1/

给出了

#define MY_HW VERSION (0x00) // hw version
  • 大写:好的(使用\U开始大写,\E结束)
  • 前缀:确定
  • 数字:好的(十六进制可能是一个问题,但这不是我的问题的目的)
  • 评论:确定(重新使用反向引用\1

但你能看到剩下的空间吗? MY_HW VERSION代替MY_HW_VERSION ...

所以我想在后面引用中替换 \1,如\1:s/\s/_/g。有可能吗?怎么做?

谢谢!

2 个答案:

答案 0 :(得分:4)

这将是单行:s cmd,适用于您的示例:(我将其分解为多行,只是为了更好的阅读)

s@\v(.*) (\d+)@
\='#define MY_'
.toupper(substitute(submatch(1),' ','_','g'))
.' (0x0'.submatch(2).') //'.submatch(1)@

答案 1 :(得分:3)

如果最多两个单词,您可以添加其他捕获组:

s/^\(\S\+\) \(\S\+\) \(\d\+\)$/#define MY_\U\1_\2\E (0x0\3)\/\/ \1/

为了获得充分的灵活性,您可以使用:help sub-replace-expression;然后你需要使用字符串连接和Vimscript函数,如toupper()而不是\U

s@^\(.*\) \(\d\+\)$@\='#define MY_' . toupper(tr(submatch(1), ' ', '_')) . '(0x0' . submatch(2) . ') //' . submatch(1)@