Как мне сделать: g с объединением субматчей в Vim? - PullRequest
1 голос
/ 28 января 2010

У меня есть файл, содержимое которого примерно равно

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 ]

2 голосов
/ 28 января 2010

Прежде всего, submatch () работает только с: substitute.

Я думаю это то, что вы хотите. На конце будет дополнительная запятая.

:let @a=''
:g/values (/normal f(l"Ayf,
:let @a=substitute(@a, ',', ', ', 'g')
1 голос
/ 29 января 2010

Если вы хотите сделать это в одну строку, вы можете сделать что-то вроде этого:

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

Часть :g запускает остаток на каждой строке (вы можете фильтровать, если хотите, но matchstr делает это в любом случае). matchstr возвращает соответствующую строку из текущей строки. \zs и \ze ограничивают фактическое совпадение, поэтому вы не получите бит 'values ​​('.

См:

:help matchstr()
:help getline()
:help \zs
:help \ze
:help :bar
0 голосов
/ 29 января 2010

В чем проблема с yi(?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...