Vim et les sauts de ligne en recherche & remplacement
Il est courant de vouloir rechercher et remplacer des choses dans Vim.
La commande :%s/pattern/remplacement/g
est là pour ça et tout se passe habituellement pour le mieux.
Sauf pour le cas particulier des sauts de ligne.
J’en ai eu la surprise (amusante) il y a peu en voulant rajouter des caractères autour des sauts de ligne avec :%s/\n/,"\n"/g
.
Les sauts de ligne on bien été trouvés et remplacée, mais pas comme je voulais.
Pour résoudre ce soucis, il faut savoir que Vim traite \n
et \r
différemment en fonction de si on recherche,
ou si on lui demande de l’écrire dans le buffer.
En recherche \n
est bien un saut de ligne et \r
correspond à un retour chariot (CR
, Ctrl-M
, ^M
).
Jusque là rien d’inhabituel.
Au remplacement par contre, \r
est un saut de ligne et \n
est un caractère nul (^@
, 0x00
).
Pour bien remplacer ses sauts de ligne, il convient donc d’écrire (par rapport à mon exemple): :%s/\n/",\r"/g
.
Liens pour approfondir techniquement
- Le post stack overflow sur lequel je suis tombé, qui m’a permis d’entrevoir le mécanisme en jeu.
- Un post stack overflow qui pousse un peu plus loin
- Une doc sur Vim qui résume ça