Получение текста, который находится на другой линии, с бывшим в Vim
Вопрос
Допустим, у меня есть следующий текст в VIM:
file1.txt
file2.txt
file3.txt
renamed1.txt
renamed2.txt
renamed3.txt
Я хочу трансформацию следующим образом:
file1.txt renamed1.txt
file2.txt renamed2.txt
file3.txt renamed3.txt
То, что я имею в виду, это что-то вроде следующее:
:1,3 s/$/ <the text that is 4 lines below this line>
Я застрял, как указать <the text that is 4 lines below this line>
часть.
Я пробовал что-то вроде .+4
(4 строки ниже текущей строки), но безрезультатно.
Решение
Вы можете сделать это с помощью BlockWise Cut & Paste.
1) Вставьте пространство в начале каждой «переименованной» линии, например :5,7s/^/ /
2) Используйте блокируемый визуальный выбор (ctrl-v
) Чтобы выбрать все строки «Файл» и нажмите d
удалить их
3) Используйте блокируемый визуальный выбор еще раз, чтобы выбрать пространственный символ в начале всех переименованных линий, и нажмите p
. Отказ Это вставит соответствующую строку из блока, которую вы удалили до начала каждой строки.
Другие советы
:1,3:s/\ze\n\%(.*\n\)\{3}\(.*\)/ \1
Объяснена:
\ze - end of replaced part of match - the string matched by the rest of the pattern will not be consumed
\n - end of current line
\%(.*\n\)\{3} - next 3 lines
\(.*\) - content of 4th line from here
Это оставит более поздние линии, где они есть.
Я бы сделал макрос для этого на самом деле. Удалить нижнюю строку, двигаться вверх, вставить, J
Линии oin, затем запускайте макрос на других. Другой метод, который я думаю, будет уместным, является отдельный скрипт для выступления фильтра.