Я хочу создать базовый скрипт Vim, который просто удаляет n строк, пропускает 1 строку и повторяется до конца документа. Меня не интересуют конкретные совпадения, я просто хочу удалить строку. Например; Поэтому я хочу повторить команду 3ddj
для всего документа.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Так это выглядит ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Спасибо.
regular-expression
normal-mode
repeated-commands
Макс Копли
источник
источник
regular-expression
в свой вопрос, но, похоже, в вопросе не указана причина для этого с помощью регулярных выражений. Если вы действительно ищете что-то, что использует регулярные выражения, stackoverflow.com/questions/17735289/… может представлять интерес. Этот вопрос был о Notepad ++, но в ответе используется только регулярное выражение pcre. (Отказ от ответственности: я написал этот ответ.)Ответы:
Очень простой подход:
qa3ddjq
На третьем шаге макрос будет повторяться тысячу раз или до появления ошибки. Попадание в конец файла (следовательно, нет строк для удаления) приводит к ошибке и повторение макроса отменяется.
См
:help recording
.источник
q
(в командном режиме и в vim или других недавних альтернативных версиях [neovim и т. д.], но не в оригинальном vi) означает «начать запись и поместить ее в буфер« следующая буква »». следовательно:qa
означает «начать запись в буфер« a ». Затемq
записываются все ключи, набранные после этого (до следующего в командном режиме) (вы даже можете записать: переход в режим редактирования, ввод чего-либо, выход в командный режим и т. Д.). Затем12@a
будет повторять все действия, которые были записаны в буфере "а" 12 раз.1000@q
в конце, вы можете сделать рекурсивный макрос:,qa3ddj@aq@a
хотя вам, возможно, придется сделать этоqaq
сначала, чтобы убедиться, что все"a
начинается пустым.Самым простым решением для меня было бы:
Это:
%
: для каждой строкиnorm
: запустить следующие клавиши как в обычном режимеj3dd
: перейти на строку, а затем удалить 3 строкиИтак, с первой строки перейдите ко второй и удалите следующие 3 строки. Второй
Text I want to keep.
сейчас на второй линии. Спуститесь на одну строку, удалите 3. Промойте и повторите.Примечание: если вы не хотите обрабатывать весь файл, вы можете заменить его,
%norm
например,5,$norm
на обработку от 5-й строки до конца файла.источник
У вас уже есть отличные решения. Вот еще один:
Сначала мы выполняем действие с каждой строкой (
:g
сопоставление с^
(начало строки)) и для каждого номера строки выполняем результатlinenumber % 4
. Если результат не равен1
, мы добавляемDELETE ME
в начале строки, отмечая строки, которые будут удалены следующей командой.Следующая команда - это команда normal (
:g
), которая соответствует всем строкам, которые начинаются с,DELETE ME
и делает это.Обратите внимание: вы не можете сразу удалить строку, используя первую
:g
команду, так как это приведет к изменению результирующего вычисления по модулю, и поэтому мы должны сначала пометить строки, а на втором шаге удалить их.источник
Я знаю, что это
vi
канал, но для меня этоsed
проблема.Таким образом, вы можете превратить его в
vi
решение:источник
Альтернатива (я полагаю, мы начинаем со строки 1 и удаляем строки 2-4, 6-8 и т. Д., Как в тексте примера):
Если вы предпочитаете делать это в интерактивном режиме, вы можете использовать «регистр командной строки». То есть нажмите
:+1del 3<CR>
а потом1000@:
источник
альтернатива: вы хотите сохранить любые строки: 1, 4 и т. д. Вы можете использовать:
другая альтернатива: если вы знаете, что линии должны соответствовать уникальному шаблону:
источник