如何在Vim中通过子匹配的串联来实现a:g?

如何在Vim中通过子匹配的串联来实现a:g?,vim,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 ... 现在,我想将字符串值(后的第一个数字拉入一个变量,最好是一次性 我想到了类似于:g/val

我有一个文件,其内容大致如下

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 ...
现在,我想将字符串
值(
后的第一个数字拉入一个变量,最好是一次性

我想到了类似于
:g/values(\(\d\+\)/let@a.=','.submatch(1)
,然后期望寄存器
a
,13,22,8

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

如何解决此问题?

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

我想这就是你想要的。结尾会有一个额外的逗号

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

yi(
)有什么问题吗?

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

let @a = '' | g/^/let @a .= matchstr(getline('.'), 'values (\zs\d\+, \ze')
:g
部分在每一行上运行其余部分(您可以根据需要进行筛选,但
matchstr
仍在进行筛选)。
matchstr
返回当前行中的匹配字符串。
\zs
\ze
分隔实际匹配,这样您就不会得到“值(”位

见:


实际上,那将是
:g/values(/normal f(l“Ayf,
),OP只需要每个值集中的第一个数字。谢谢你的回答。再加上wich的更正,这就是我想要的。
:help matchstr()
:help getline()
:help \zs
:help \ze
:help :bar