Редактор Vi: Какой самый быстрый способ удалить несколько строк в файле?

12

Я хотел бы использовать редактор Vi, чтобы удалить несколько строк в файле. Пожалуйста, дайте мне идею или предложение.

Моя цель такова:

Перед:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
.
.
29
30
.
.

После;

1
10
20
30
40
.
.
rangsiman
источник
3
как вы выбрали строки для удаления? Вы хотите оставить один ряд каждые 10?
Мацци
1
Вы можете удалить диапазоны строк, :[range]dнапример, :3,5dудалив строки с трех по пять (включительно).
Братчли
6
Также есть vi.stackexchange .
Алексей
@R Ketkaew - Вы пытаетесь удалить список чисел или они строки? Не могли бы вы обновить свой вопрос, чтобы уточнить?
DarkHeart
Я знаю, что вы спрашиваете о Vi, но вы можете сделать и с GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Ответы:

17

Если вы хотите сохранить каждую десятую строку и удалить остальные:

%norm 9ddj

Объяснение:

% весь файл

norm выполните следующие команды в "нормальном режиме"

9dd удалить 9 строк

j сдвинуться вниз на одну строку (т.е. оставить ее)

примечание: это удаляет первый ряд.

Адаптировано с http://www.rayninfo.co.uk/vimtips.html


Или с помощью глобальной команды:

  • Дублируйте первую строку ggYP
  • :g/^/+ d9

Адаптировано с /programming/1946738/vim-how-to-delete-every-second-row


Или вы можете использовать awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Темное сердце
источник
У меня работает команда awk. Я всегда думал, что для awk требуется минимум один блок {...}. приятно знать, что нет. Это первая нетривиальная команда awk, с которой я работал!
the_velour_fog
1
@the_velour_fog блок будет необходимо. если вы не напишите, AWK будет вести себя так, как если бы вы написали{ print $0 }
shadowtalker
@RKetkaew Какой из вариантов вы использовали? Если ответ решает ваш вопрос, нажмите на галочку, чтобы пометить его как ответ.
underscore_d
@underscore_d Привет! Я использовал команду, предложенную DarkHeart. Спасибо за ваши Коментарии.
Рангсиман
12
:2,$v/0$/d

удаляет строки, которые не заканчиваются, 0начиная со второго.

Стефан Шазелас
источник
2
Это умное решение. Я бы просто добавить объяснение , что 2,$это диапазон, и v/0$/dв g!команде. Где 0$находится регулярное выражение и dкоманда ex, которая будет выполняться на всех не совпадающих строках.
Грохмал