Comment le faire dans Vim:
AVANT:
aaa
bbb
ccc
ddd
eee
fff
APRÈS:
aaa
ccc
eee
Comment le faire dans Vim:
AVANT:
aaa
bbb
ccc
ddd
eee
fff
APRÈS:
aaa
ccc
eee
Réponses:
Vous pouvez utiliser une macro pour cela. Procédez comme suit.
gg
.qq
.dd
après.q
.10000@q
PS: Pour passer en mode commande, appuyez simplement sur Echap plusieurs fois.
:g/^/+d
de l'utilisateur stackoverflow.com/users/254635/ib (ci-dessous) est un moyen plus élégant de résoudre ce problème.
Un moyen élégant (et efficace) d'accomplir la tâche consiste à appeler la :+delete
commande en supprimant la ligne qui suit la ligne actuelle, sur chaque ligne à l'aide de la :global
commande:
:g/^/+d
:1d|g/^/+d
supprime les lignes impaires.
Nous pouvons utiliser :normal
ou :norm
exécuter des commandes de mode normal données. La source.
:%norm jdd
%norm ddj
ne fonctionne pas si vous souhaitez supprimer des lignes impaires.
:map ^o ddj^o
^o
Ici ^ représente 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 de messagerie vim :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(À taper sur une ligne de la ligne de commande vim, supprimera la ligne 1,3,5,7, ...)
!perl -ne 'print unless $. % 2'
:-)
if (expression)
laquelle fonctionne également pour chaque troisième ligne, etc.
Vous pouvez toujours exécuter une commande shell, ce qui signifie que vous pouvez utiliser n'importe quel langage de script que vous aimez:
:%!perl -nle 'print if $. % 2'
(ou utilisez "sauf" au lieu de "si", selon les lignes souhaitées)
-l
passer à Perl ... aussi, je dirais que awk
c'est un peu plus répandu que Perl, bien que ce ne soit pas vraiment beaucoup plus de nos jours, et que vous puissiez le faire plus court:, :%!awk NR\%2
ou :%!awk 1-NR\%2
pour les autres lignes.
:%!awk -- '++c\%2'
alternativement
:%!awk -- 'c++\%2'
selon la moitié que vous souhaitez éliminer.
NR
variable existante ?
:%!awk NR\%2
ou :%!awk 1-NR\%2
, comme je l'ai posté dans un autre commentaire. Ce n'est guère plus long.
1-NR
est plus long que c++
. Oui, je sais que c'est un personnage. Comme je l'ai dit, la vraie raison est que je l'ai oublié. Quoi qu'il en soit, on dirait que les gens n'apprécient pas la beauté de awk ici.
NR
est plus court que ++c
:)
Vous pouvez utiliser les propres capacités de recherche et de substitution de Vim comme ceci: Placez votre curseur sur la première ligne et tapez en mode normal:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/
est la plage pour la substitution. Cela signifie "de cette ligne à la ligne qui correspond à l'expression régulière fff
(dans ce cas, la dernière ligne).s///
est la commande de substitution. Il recherche une expression régulière et remplace chaque occurrence de celle-ci par une chaîne. Le g
à la fin signifie répéter la substitution tant que l'expression régulière continue d'être trouvée.\n.*\(\n.*\)
correspond à une nouvelle ligne, puis à une ligne entière ( .*
correspond à n'importe quel nombre de caractères à l'exception d'une nouvelle ligne), puis à une autre nouvelle ligne et une autre ligne. Les parenthèses \(
et \)
provoquent l'enregistrement de l'expression à l'intérieur, afin que nous puissions l'utiliser plus tard en utilisant\1
.\1
insère la nouvelle ligne groupée et la ligne qui suit, car nous ne voulons pas que la ligne suivante disparaisse aussi - nous voulons juste que le mécanisme de substitution passe à côté afin de ne pas la supprimer dans le prochain remplacement.De cette façon, vous pouvez contrôler la plage dans laquelle vous souhaitez que la suppression ait lieu et vous n'avez pas besoin d'utiliser d'outil externe.
$
au lieu de /fff/
, pour la fin du fichier quel que soit le contenu du fichier.
Comme autre approche, vous pouvez également utiliser python si votre vim le prend en charge.
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]
copie temporairement toutes les lignes de la mémoire tampon actuelle dans b
. b[::2]
récupère chaque deuxième ligne du tampon et l'assigne à l'ensemble du tampon courant cb[:]
. La copie vers b
est nécessaire car les objets tampons ne semblent pas prendre en charge la syntaxe de tranche étendue.
Ce n'est probablement pas la "manière vim", mais cela pourrait être plus facile à retenir si vous connaissez python.
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 caractère de nouvelle ligne et un peu plus de texte (forme la deuxième ligne) suivi d'un autre caractère de nouvelle ligne et remplacez ce qui précède par la première correspondance (ligne impaire) ou la deuxième correspondance (ligne paire) suivi d'un retour chariot.
vous pouvez essayer ceci dans vim
:1,$-1g/^/+1d
J'essaierai d'être plus clair (deux parties)
première partie la plage de sélection ( :from,to
)
deuxième partie l'action ( d
supprimer)
:1,$-1
)g
) delete ( +1d
) ligne suivantevous pouvez essayer de passer à la première ligne de votre fichier et exécuter :+1d
vous verrez la ligne suivante disparaître
Je sais que c'est boueux, mais c'est vim et ça marche