4

У меня есть куча данных, и я хочу скопировать в регистр все, что соответствует следующему регулярному выражению:

/'user': '[a-Z]*'

Есть ли способ скопировать все совпадения в реестр в vanilla vim? Я посмотрел на этот вопрос, но он работает только для одного результата, после нажатия «n», чтобы перейти к следующему результату, он снова будет использовать «//e» и перейти к концу следующего результата, вместо начало.

Я также посмотрел на этот ТАК вопрос. Это почти то, что я ищу, за исключением того, что я не могу понять, как изменить его так, чтобы он работал с конкретными совпадениями вместо линий, на которых они находятся.

4 ответа4

6

Это может быть просто достигнуто, выполнив команду :s с установленным флагом n (который в основном говорит, чтобы ничего не заменять), но используя \= в части замены, вы все равно можете захватывать совпадения (см :h sub-replace-special). Итак, сначала давайте очистим регистр A:

qaq

Затем вы можете записать свои мачи в реестр, используя:

:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn

И вставьте свои спички:

:put A

Для этого нужен как минимум Vim 7.4 (я забыл фактический номер патча).

3

очистить регистр

qaq

msgstr "глобальный поиск и восстановление всех строк ('A') в регистр 'a'

:g/'user': '[a-Z]*'/y A

Измените часть между :g/ and /y A мере необходимости.

"вставить в другой файл

"aP

0

Вы можете использовать команду :YankMatches из моего плагина ExtractMatches:

:%YankMatches /'user': '[a-Z]*'/

Каждое совпадение по умолчанию ставится на новую строку; использовать другой разделитель, есть альтернативная форма.

0

Вероятно, есть лучший способ (это неэффективно, если мы говорим о действительно большом количестве записей - это должно быть хорошо, если мы не говорим тысячи и тысячи), но первое, что приходит на ум, это рекурсивный макрос. Во-первых, включите опцию wrapscan, чтобы поиски, достигшие конца файла, больше не повторялись до начала (иначе вы получите бесконечный цикл):

:set nowrapscan

Затем убедитесь, что у вас есть два четких регистра:

qqq
qaq

Теперь магия:

qq/'user': '[a-Z]*'
"Ay//e
@qq

qq начинает запись всех ваших нажатий клавиш в регистр q . Использование заглавной буквы заставляет vim добавлять этот регистр, а не перезаписывать его. y//e возвращает к концу вашего поиска. @q вызывает (в настоящее время пустой) регистр q как макрос, а последний q останавливает запись. Тогда просто:

@q

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .