Получение текста, который находится на другой строке, с ex в Vim - PullRequest
1 голос
/ 25 июня 2010

Допустим, у меня есть следующий текст в 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 строки ниже текущей строки), но безрезультатно.

Ответы [ 3 ]

7 голосов
/ 25 июня 2010

Вы можете сделать это с помощью blockcut cut & paste.

1) вставить пробел в начале каждой «переименованной» строки, например, :5,7s/^/ /

2) Использовать блочный визуальный выбор (ctrl-v), чтобы выбрать все строки "файла", и нажмите d, чтобы удалить их

3) снова используйте блочное визуальное выделение, чтобы выбрать пробел в начале всех переименованных строк, и нажмитеp.Это вставит соответствующую строку из блока, который вы удалили, в начало каждой строки.

4 голосов
/ 25 июня 2010
: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

Это оставит более поздние строки там, где они есть.

3 голосов
/ 25 июня 2010

Я бы сделал для этого макрос. Удалите нижнюю строку, переместитесь вверх, вставьте J oin строки, затем запустите макрос на остальных. Другой метод, который я считаю подходящим, - это отдельный скрипт, который будет действовать как фильтр.

...