Vim: comment supprimer chaque seconde ligne?

Comment le faire dans Vim:

AVANT:

aaa bbb ccc ddd eee fff 

APRÈS:

 aaa ccc eee 

Vous pouvez utiliser une macro pour cela. Procédez comme suit

  • Commencez en mode de 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, appuyez sur Escape plusieurs fois.

Un moyen élégant (et efficace) d’accomplir cette tâche consiste à exécuter la commande :+delete supprimant la ligne située à côté de la ligne actuelle, sur chaque ligne à l’aide de la commande :global .

 :g/^/+d 

Nous pouvons utiliser :normal ou :norm pour exécuter des commandes en mode normal. La source.

 :%norm jdd 
 :map ^o ddj^o ^o 

Ici, on entend CTRL. Macro récursive pour supprimer une ligne toutes les deux lignes. Choisissez bien votre première ligne et c’est fait.

à partir de l’ archive mail vim :

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

(Pour être saisi sur une ligne de la ligne de commande vim, supprimera la ligne 1,3,5,7, ...)

Vous pouvez toujours utiliser une commande shell, ce qui signifie que vous pouvez utiliser n’importe quel langage de script:

 :%!perl -nle 'print if $. % 2' 

(ou utilisez “sauf” au lieu de “si”, selon les lignes que vous voulez)

 :%!awk -- '++c\%2' 

alternativement

 :%!awk -- 'c++\%2' 

en fonction de la moitié que vous souhaitez éliminer.

Comme autre approche, vous pouvez également utiliser python si votre vim a le support pour cela.

 :py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2] 

b = cb[:] copie temporairement toutes les lignes du tampon courant vers b . b[::2] obtient chaque seconde ligne du tampon et l’assigne à la totalité du tampon courant cb[:] . La copie sur b est nécessaire car les objects tampons ne semblent pas prendre en charge la syntaxe slice étendue.

Ce n’est probablement pas le “vim way”, mais pourrait être plus facile à retenir si vous connaissez le python.

Vous pouvez utiliser les fonctions de recherche et de substitution de Vim comme suit: Placez votre curseur sur la première ligne et saisissez le mode normal:

 :.,/fff/s/\n.*\(\n.*\)/\1/g 
  • Le .,/fff/ est la plage pour la substitution. Cela signifie “de cette ligne à la ligne qui correspond à la regex fff (dans ce cas, la dernière ligne).
  • s/// est la commande de substitution. Il recherche une expression régulière et en remplace chaque occurrence par une chaîne. Le g à la fin signifie répéter la substitution tant que le regex continue à être trouvé.
  • Le regex \n.*\(\n.*\) Correspond à une nouvelle ligne, puis une ligne entière ( .* Correspond à un nombre quelconque de caractères à l’exception d’une nouvelle ligne), puis une autre nouvelle ligne et une autre. Les parenthèses \( et \) provoquent l’enregistrement de l’expression à l’intérieur, nous pouvons donc l’utiliser plus tard avec \1 .
  • \1 insère la nouvelle ligne groupée et la ligne après celle-ci, parce que nous ne voulons pas que la prochaine ligne disparaisse aussi – nous voulons simplement que le mécanisme de substitution passe pour que nous ne le supprimions pas lors du prochain remplacement.

De cette façon, vous pouvez contrôler la plage dans laquelle vous voulez que la suppression ait lieu et vous n’avez pas à utiliser d’outil externe.

Pour supprimer les lignes impaires (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g

Pour supprimer les lignes paires (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g

Recherchez du texte (forme la première ligne) suivi d’un nouveau caractère de ligne et d’un peu de texte (forme la deuxième ligne) suivi d’un autre caractère de ligne et remplacez ce qui précède par une première correspondance (ligne impaire) ou une deuxième correspondance (ligne paire) suivi du retour chariot.

vous pouvez essayer cela dans vim

 :2,$-1g/^/+1d