Замена VIM:Использование текущей строки в качестве строки поиска

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

  •  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

А затем замените ничем.

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