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!