У меня есть несколько строк в файле, и я хотел бы скопировать каждую строку 11 раз (превратив каждую строку в 12 строк), и увеличить последнюю «1» в каждой строке, чтобы 12 строк имели «1» - «до» 12 ", где" 1 "изначально была. Могут быть и другие вхождения «1» в каждой строке, но «1», который я хочу увеличить, всегда будет последним вхождением в каждой строке. Другой способ взглянуть на это состоит в том, что последний «1» всегда следует после «/ nt /» - как в «/ nt / 1» (и это всегда будет единственное вхождение «/ nt / 1» в каждой строке) ,
Так, например, если у меня есть:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Я хочу превратить это в:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
Я ранее нашел команду:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
работает для этой цели, но мне придется вручную запускать эту команду для каждой строки и вводить каждую строку (или копировать и вставлять ее) самостоятельно. Есть ли способ взять строки, которые уже есть в файле, и просто выполнить одну команду, которая превращает каждую строку в двенадцать, как я описал?
Заранее спасибо всем, кто может мне помочь с этим. Я также просто хотел отметить, что это мой второй вопрос, и я был рад получить несколько быстрых и эффективных решений моего первого вопроса, за что я был очень благодарен.
источник
Вы можете сделать это путем
global
ex для выполнения макроса n раз для каждой строки в файле.После записи макроса отмените изменения, сделанные во время записи, или будет n + 1 дополнительных строк для первой строки и n для последовательных строк.
Запишите макрос в
a
регистр с помощьюЭто записывает в register
a
(qa...q
) следующую команду:yyp
: дублировать текущую строку$
: перейти к концу строки?\d<CR>
: поиск в обратном направлении для одной цифры<C-A>
: увеличить цифру под курсором на единицуКогда макрос записан, удалите изменения, сделанные во время записи, либо отменив (
uu
) или удалив текущую строку (dd
). Затем повторите макрос11
(или любое количество раз) для каждой строки в файле с помощью глобальной команды:источник
Два пути:
Используйте макрос!
Начиная с
С вашим курсором на первой строке
Который делает:
qq
Начать запись макроса в регистр qyyp
выдерните текущую строку и вставьте ее ниже$?\d<CR>
Идите до конца строки и найдите первую цифру, оглядываясь назад.<Ctrl-a>
Увеличение числаq
Прекратите запись макроса.Это оставляет вас с:
С курсором на второй строке. Просто повторите этот макрос столько раз, сколько необходимо (например, повторите это десять раз с 10 @ q). Если вы хотите автоматизировать этот процесс для каждой строки, выполните его глобально для каждой строки:
:g//normal 11@q
В качестве альтернативы, с более новой версией vim: вставьте нужную строку сколько угодно раз, визуальный блок выберите цифру, которую вы хотите увеличить, и нажмите
g <Ctrl-a>
. Это должно увеличивать все числа в визуальном блоке по вашему желанию. Однако это более ручной процесс.источник
g <c-a>
пути. Спасибо, что поделился.Я считаю, что проще всего использовать макросы для подобных задач. Просто начните запись макроса с
q
+ имя регистра и выполните задачу один раз. Я вижу здесь одно повторяемое задание:Теперь запишите необходимые нажатия клавиш для регистрации
a
в обычном режиме:Снова удалите строку, чтобы проверить, дает ли выполнение макроса 11 раз правильный результат для одной строки:
Оно делает! Итак, давайте снова отменим и автоматизируем весь процесс во втором макросе
b
:Теперь вы можете выполнить
@b
до конца файла, и он должен произвести вывод, который вы хотите. Звучит сложно, но на самом деле вы не привыкли к типичным шаблонам редактирования.источник
qaVyp$b<c-a>
. Или лучше, простоqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
от @fruglemonkey и @jjaderberg лучше, так как он ищет последний номер. Я изменю его на полноту.Сохраните следующий макрос и используйте его для каждой строки:
Основное отличие от других ответов заключается в том, что при этом используется
g<C-a>
выбор столбца, который увеличивает каждую строку на другое число. Проверьте:help v_g_CTRL-A
для получения дополнительной информации. Я также использовал,\zs
чтобы выбрать начальную позицию шаблона, так что курсор останавливается на числе после поиска.Обратите внимание, что для этого вам нужна последняя версия Vim.
источник
g<C-a>
то же самое @fruglemonkey, на которое вы ссылались, но спасибо за ответ. Я должен отметить, что при попытке вашего макроса - непосредственно перед тем, как я доберусь доg<C-a>
детали, это не последний символ «1», который я хочу увеличить, который подсвечивается блоком, но вместо этого это символ перед первым «1 msgstr "символ, выделенный блоком. (Кроме того, я думаю, что это было быyy11p
и10j
в макросе, так как я собираюсь добавить 11 строк - всего 12).\zs
, но я мог бы просто добавитьl
после<CR>
.vim -u NONE
. Я только что сделал это, и это работает отлично! На самом деле, поиск не будет соответствовать первому 1, потому что для этого требуется предшествующий слеш.