我如何做一个:g在Vim中连接子匹配?

时间:2010-01-28 17:08:50

标签: vim

我有一个文件,其内容大致类似于

insert into FooBar values (13, 19, 220, 108);
// some text,
// some more text
insert into MixMax values (22,  5, 87, 1);
// and so on
insert into HooHoo values (8, 37, 222, 51);
// etc ...

现在,我想将字符串values (之后的第一个数字拉入变量,最好是一次性。

我想到了类似:g/values (\(\d\+\)/let @a .= ', ' . submatch(1)的内容,然后希望注册a,13,22,8

不幸的是,使用这种方法,我只得到逗号,而不是子匹配,即寄存器的内容是,,,

我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

首先,submatch()仅适用于:substitute。

认为这就是你想要的。最后会有一个额外的逗号。

:let @a=''
:g/values (/normal f(l"Ayf,
:let @a=substitute(@a, ',', ', ', 'g')

答案 1 :(得分:1)

如果你想在一行上做,你可以这样做:

let @a = '' | g/^/let @a .= matchstr(getline('.'), 'values (\zs\d\+, \ze')

:g部分在每一行上运行其余部分(您可以根据需要进行过滤,但无论如何matchstr正在执行此操作)。 matchstr返回当前行的匹配字符串。 \zs\ze分隔实际匹配,因此您无法获得'值('位。

请参阅:

:help matchstr()
:help getline()
:help \zs
:help \ze
:help :bar

答案 2 :(得分:0)

yi(有什么问题?