É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
.
.

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'

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.