Замена VIM:Использование текущей строки в качестве строки поиска
-
18-09-2019 - |
Вопрос
Предполагая следующий текстовый файл, который на самом деле является дампом данных о фондах и ценовой статистике:
PBCPDF
05/01/2006
0.0000
0.0000
PBCPDF
0.0000
06/01/2006
0.0000
0.0000
PBCPDF
0.0082
[… lines repeat …]
Чего я хотел добиться, так это удалить все экземпляры PBCPDF
за исключением первого, в котором я мог бы написать команду подстановки как :.+1,$s/PBCPDF\n//g
.
Однако, поскольку я хотел запрограммировать макрос для обработки нескольких названий фондов, мне нужно средство для использования какого-то шаблона, который извлекал бы текущую строку в качестве шаблона поиска без того, чтобы я делал это вручную.
Есть ли способ сделать это?
Решение
Если вы делаете это в макросе (используя команду q), он достаточно умен, чтобы перехватывать, когда вы выполняете некоторые из более эзотерических команд нажатия клавиш - та, о которой я конкретно думаю, это CTRL-R, CTRL-W, которая вставит слово под курсором в командную строку.Так, например, если бы вы сделали
ESC qw /[CTRL-R, CTRL-W] (you should see the word under the cursor enter the command line) [enter] q
затем вы только что создали макрос, который ищет следующее слово в буфере, такое же, как это, понимаете?Он будет динамически вставлять слово под курсором в команду как часть макроса.В приведенной выше команде может быть что-то вроде CTRL-W, которое делает это для всей строки, но я не знаю этого навскидку.
Другие советы
ggyy:+1,$s/<Ctrl-R>"<BS>//g
Давайте посмотрим, что именно это дает.
Перейдите к первой строке
gg
Выдернуть всю ленту
yy
Начните замену
:+1,$s/
Получите текущую строку из регистра, к которому вы ее подключили:
<Ctrl-R>"
Примечание:Не вводите ", вы должны фактически удерживать Control и нажимать R, за которым следует двойная кавычка.
Удалить символ конца строки:
<BS>
Примечание:нажмите Пробел назад.
Замените ничем.
//g
Вы можете записать это в макрос, обернув его символом qq / q или чем-то еще.
Изучив ответы сикоры и Мэтта, я придумал немного лучшее улучшение, которое работает по строкам, а не по словам (согласно Решение Мэтта).
Эта команда должна быть выполнена после наведения курсора на строку, из которой должно произойти удаление:
:.+1,$s/<CTRL-R>=getline(".")<CR>\n//g
Объяснение для начинающих пользователей VIM:
:.+1,$s/
Начните замену со строки после текущей строки (.+1
) и конец файла ($
)
<CTRL-R>=getline(".")<CR>\n
<CTRL-R>
относится к фактическому нажатию клавиш CTRL и R, которые позволяют вводить специальные выражения.В данном случае, =getline(".")
который извлекает текст текущей строки.
<CR>
относится к нажатию клавиши enter, которое завершает <CTRL-R>
выражение.Я также указываю символ новой строки (\n
) в конце шаблона поиска, так как мне нужно его удалить.
//g
А затем замените ничем.