我想在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
。有可能吗?怎么做?
谢谢!
答案 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)@