Edytor Vi: Jaki jest najszybszy sposób na usunięcie wielu wierszy w pliku?

12

Chciałbym użyć edytora Vi do usunięcia wielu wierszy w pliku. Proszę o pomysł lub sugestię.

Mój cel jest taki:

Przed:

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

Po;

1
10
20
30
40
.
.
rangsiman
źródło
3
jak wybrałeś wiersze do usunięcia? Czy chcesz opuścić jeden rząd na 10?
matzeri
1
Możesz usunąć zakresy wierszy, :[range]dna przykład :3,5dusuwa wiersze od trzeciego do piątego (włącznie).
Bratchley,
6
Istnieje również vi.stackexchange .
Alexey,
@R Ketkaew - Czy próbujesz usunąć listę liczb, czy są to wiersze? Czy możesz zaktualizować swoje pytanie, aby wyjaśnić?
DarkHeart,
Wiem, że pytasz o Vi, ale możesz też zrobić z GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Odpowiedzi:

17

Jeśli masz na myśli, że chcesz zachować co 10 linię i usunąć resztę:

%norm 9ddj

Wyjaśnienie:

% cały plik

norm wykonaj następujące polecenia w „trybie normalnym”

9dd usuń 9 linii

j przesuń w dół o jedną linię (tj. zachowaj)

Uwaga: usuwa pierwszy wiersz.

Na podstawie http://www.rayninfo.co.uk/vimtips.html


Lub za pomocą polecenia globalnego:

  • Duplikuj pierwszą linię ggYP
  • :g/^/+ d9

Na podstawie /programming/1946738/vim-how-to-delete-every-second-row


Lub możesz użyć awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Ciemne serce
źródło
Polecenie awk działa dla mnie. Zawsze myślałem, że awk wymaga minimum jednego bloku {...}. dobrze wiedzieć, że nie. Jest to pierwsze nietrywialne polecenie awk, które uruchomiłem!
the_velour_fog
1
@ the_velour_fog blok jest wymagany. jeśli nie napiszesz jednego, AWK zachowa się tak, jakbyś napisał{ print $0 }
shadowtalker
@RKetkaew Której opcji użyłeś? Jeśli odpowiedź rozwiązuje twoje pytanie, kliknij znacznik, aby zaznaczyć je jako odpowiedź.
underscore_d
@underscore_d Cześć, użyłem polecenia sugerowanego przez DarkHeart. Dziękuję za twoje komentarze.
rangsiman 17.07.16
12
:2,$v/0$/d

usuwa linie, które nie kończą się 0od drugiego.

Stéphane Chazelas
źródło
2
To jest sprytne rozwiązanie. Chciałbym tylko dodać, że wyjaśnienie 2,$jest zakres i v/0$/dna g!komendę. Gdzie 0$jest wyrażenie regularne i dpolecenie ex, które będzie uruchamiane na wszystkich niezgodnych wierszach.
grochmal