Éditeur Vi: Quel est le moyen le plus rapide pour supprimer plusieurs lignes dans un fichier?

12

Je voudrais utiliser l'éditeur Vi pour supprimer plusieurs lignes dans un fichier. Veuillez me donner une idée ou une suggestion.

Mon objectif est le suivant:

Avant:

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

Après;

1
10
20
30
40
.
.
rangsiman
la source
3
comment choisissez-vous les lignes à supprimer? Veux-tu laisser un rang tous les 10?
matzeri
1
Vous pouvez supprimer des plages de lignes en supprimant :[range]dpar exemple les :3,5dlignes trois à cinq (inclusivement).
Bratchley
6
Il y a aussi vi.stackexchange .
Alexey
@R Ketkaew - Essayez-vous de supprimer une liste de numéros ou s'agit-il de lignes? Pourriez-vous mettre à jour votre question pour clarifier?
DarkHeart
Je sais que vous posez des questions sur Vi, mais vous pouvez aussi faire avec GNU Sed:gsed -n '1p; 0~10p'
shadowtalker

Réponses:

17

Si vous voulez conserver toutes les 10 lignes et supprimer le reste:

%norm 9ddj

Explication:

% fichier entier

norm exécuter les commandes suivantes en "mode normal"

9dd supprimer 9 lignes

j descendre d'une ligne (c'est-à-dire la garder)

remarque: cela supprime la première ligne.

Adapté de http://www.rayninfo.co.uk/vimtips.html


Ou en utilisant la commande globale:

  • Dupliquer la première ligne ggYP
  • :g/^/+ d9

Adapté de /programming/1946738/vim-how-to-delete-every-second-row


Ou vous pouvez utiliser awk:

%!awk 'NR \% 10 == 0 || NR == 1'
Cœur sombre
la source
La commande awk fonctionne pour moi. J'ai toujours pensé que awk nécessitait au moins un bloc {...}. bon de savoir que vous ne le faites pas. C'est la première commande awk non triviale que je travaille!
the_velour_fog
1
@the_velour_fog le bloc est requis. si vous n'en écrivez pas, AWK se comportera comme si vous aviez écrit{ print $0 }
shadowtalker
@RKetkaew Laquelle des options avez-vous utilisée? Si une réponse résout votre question, veuillez cliquer sur la coche pour la marquer comme réponse.
underscore_d
@underscore_d Salut, j'ai utilisé une commande suggérée par DarkHeart. Merci pour vos commentaires.
rangsiman
12
:2,$v/0$/d

supprime les lignes qui ne finissent pas en 0commençant par la seconde.

Stéphane Chazelas
la source
2
Ceci, c'est la solution intelligente. Je voudrais juste ajouter une explication qui 2,$est la plage et v/0$/dla g!commande. Où se 0$trouve l'expression régulière et dla commande ex qui seront exécutées sur toutes les lignes qui ne correspondent pas.
grochmal