J'ai des lignes comme
abcdefgjoin!
abcdef
no join
abcdefgjoin!
Si une ligne correspond à la regex ^a.+g$
alors je voudrais qu'ils soient rejoints, donc ce serait :
abcdefgjoin!
abcdef
no join
abcdefgjoin!
Existe-t-il un moyen de le faire dans VIM
?
Réponse acceptée :
En mode normal, J
(à distinguer de j
, qui déplace le curseur vers le bas d'une ligne) est utilisé pour joindre une ligne avec celle qui se trouve juste en dessous. Cependant, par défaut, il ajoute un espace à la fin de la première ligne; pour obtenir le résultat souhaité (joindre les lignes sans insérer d'espace supplémentaire), il faudrait utiliser gJ
.
Afin d'utiliser les commandes en mode normal en mode ex (que vous entrez en appuyant sur :
en mode normal), il faut utiliser le normal
commande. Voir :h normal
au sein de vim. Donc, pour travailler avec la ligne suivante qui correspond au motif, on utiliserait (notez que par défaut, vous devez échapper le +
pour le faire fonctionner avec la regex de vim, une conséquence du maintien de la compatibilité avec l'ancien moteur de regex de vi) :
:/^a.\+g$/normal gJ
Pour travailler sur chaque ligne qui correspond au motif, on utiliserait le :global
commande (voir :h :g
dans vim) comme ceci :
:global/^a.\+g$/normal gJ
Ou, plus concis :
:g/^a.\+g$/norm gJ
Il est également possible d'utiliser la commande ex join
(voir :h :join
) pour obtenir la même chose avec un peu moins de saisie (le !
à la fin, dans ce cas, indique join
de ne pas insérer d'espace à la fin de la première ligne).
:g/^a.\+g$/join!