115 votes

Comment supprimer une ligne sur deux dans Vim ?

Je voudrais supprimer une ligne sur deux d'un tampon Vim, en commençant par la deuxième, c'est-à-dire les lignes 2, 4, 6, etc. Par exemple, si le contenu du tampon est :

aaa
bbb
ccc
ddd
eee
fff

puis, après la suppression de la ligne souhaitée, il devrait devenir :

aaa
ccc
eee

Quelles commandes Vim peuvent être utilisées pour automatiser cette opération ?

0 votes

Vous devriez être capable d'utiliser une macro : oreillynet.com/mac/blog/2006/07/

0 votes

J'aime la richesse des réponses à cette question. Favoriser.

296voto

ib. Points 14520

Une manière élégante (et efficace) d'accomplir cette tâche est d'invoquer la fonction :delete (voir :help :d ) pour le +  gamme de lignes (identique à  .+1 ) en adressant la ligne qui suit la ligne actuelle (voir :help {address} ), sur chaque ligne (voir :help /^ ) en utilisant le :global (voir :help :g ):

:g/^/+d

12 votes

Pourquoi cette réponse n'a-t-elle pas obtenu plus de votes positifs ? C'est tellement simple et propre. Vous pouvez également supprimer la première ligne et exécuter la commande ci-dessus pour supprimer toutes les lignes impaires.

4 votes

@Usagi : Merci ! Je ressens la même chose à ce sujet. Et oui, vous avez tout à fait raison, :1d|g/^/+d supprime les lignes impaires.

0 votes

L'autre réponse a été sélectionnée comme "meilleure réponse" 2 ans avant que sa réponse n'apparaisse. De plus, bien que cette solution soit plus élégante, elle aurait pu être écrite de manière plus utile (c'est-à-dire qu'il n'y a aucune mention de ce que fait ^, alors que la macro est facile à comprendre pour tout le monde).

119voto

rui Points 4282

Vous pouvez utiliser une macro pour cela. Faites ce qui suit.

  • Démarrer en mode commande.
  • Allez au début du fichier en appuyant sur gg .
  • Appuyez sur qq .
  • Cliquez sur la flèche vers le bas et appuyez sur dd après.
  • Appuyez sur q .
  • Appuyez sur 10000@q

PS : Pour passer en mode commande, il suffit d'appuyer plusieurs fois sur la touche Escape.

11 votes

En supposant que votre fichier compte moins de 20 000 lignes, bien sûr :-)

0 votes

+ ! à diablo, C'est important sinon vous allez continuer à effacer des lignes.

3 votes

En fait, vous avez tort, Michael. Cela fonctionne parfaitement car VI arrête l'exécution de la macro dès qu'il atteint la fin du fichier. Vous pouvez très facilement l'essayer avec l'exemple ci-dessus.

75voto

Tadhg Points 256

Nous pouvons utiliser le :normal (ou :norm ) pour exécuter le site j  y dd  Commandes en mode normal :

:%norm jdd

Source : le site Les meilleures astuces de Vim page par zzapper.

17 votes

Cette réponse ne fait pas l'objet d'une attention suffisante, probablement en raison du manque d'explications, tant ici que sur l'aide-mémoire désordonné lié. La commande norm exécute les commandes du mode normal équivalentes aux lettres qui la suivent. Donc ici, elle exécute j pour descendre d'une ligne, et dd pour la supprimer. Ceci est généralisable à la Xème ligne en ajoutant plus de 'j' dans ce cas.

5 votes

Et le % est un raccourci pour 1,$ (exécutez la commande suivante de la ligne 1 à la fin)

4 votes

Je suis intéressé par la raison pour laquelle %norm ddj ne fonctionne pas si vous voulez supprimer des lignes impaires.

10voto

Raoul Supercopter Points 2943
:map ^o ddj^o
^o

Ici ^ signifie CTRL. Macro récursive pour supprimer une ligne toutes les deux lignes. Choisissez bien votre première ligne et c'est fait.

8voto

Fortega Points 8890

De archive de courrier vim :

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(A taper sur une ligne dans la ligne de commande vim, supprimera les lignes 1,3,5,7,...)

4 votes

Alors je préférerais !perl -ne 'print unless $. % 2' :-)

0 votes

Et, Alex, je préfère nettement ma solution à la tienne, mais celle-ci vaut la peine d'être considérée car c'est la seule solution raisonnable utilisant uniquement vim lui-même ici.

0 votes

La méthode macro est tellement plus facile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X