Получение текста, который находится на другой линии, с бывшим в Vim

StackOverflow https://stackoverflow.com/questions/3120449

  •  30-09-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top