Comment remplacer un caractère par une nouvelle ligne dans Vim ?

J'essaie de remplacer chaque , du fichier actuel par une nouvelle ligne :

:%s/,/\n/g 

Mais il insère ce qui ressemble à un ^@ au lieu d'une véritable nouvelle ligne. Le fichier n'est pas en mode DOS ou autre.

Que dois-je faire ?

Si vous êtes curieux, comme moi, consultez la question [Pourquoi \r est une nouvelle ligne pour Vim ?][1] également.

[1] : https://stackoverflow.com/questions/71417/why-is-r-a-newline-for-vim

Solution

Utilisez \r au lieu de \n.

La substitution par \n insère un caractère nul dans le texte. Pour obtenir une nouvelle ligne, utilisez \r. En revanche, pour rechercher une nouvelle ligne, vous utiliserez toujours \n. Cette asymétrie est due au fait que \n et \r [font des choses légèrement différentes] (http://vim.wikia.com/wiki/Search_and_replace) :

\n correspond à une fin de ligne (nouvelle ligne), tandis que \r correspond à un retour chariot. D'autre part, dans les substitutions, \n insère un caractère nul alors que \r insère une nouvelle ligne (plus précisément, il est traité comme l'entrée ). Voici un petit exemple non interactif pour illustrer cela, en utilisant la fonctionnalité de ligne de commande de Vim (en d'autres termes, vous pouvez copier et coller ce qui suit dans un terminal pour l'exécuter). xxd montre un hexdump du fichier résultant.

echo bar > test
(echo 'Before:'; xxd test) > output.txt
vim test '+s/b/\n/' '+s/a/\r/' +wq
(echo 'After:'; xxd test) >> output.txt
more output.txt
Before:
0000000: 6261 720a                                bar.
After:
0000000: 000a 720a                                ..r.

En d'autres termes, \n a inséré l'octet 0x00 dans le texte ; \r a inséré l'octet 0x0a.

Commentaires (16)

Vous devez utiliser

:%s/,/^M/g

Pour obtenir le caractère ^M, appuyez sur Ctrl v suivi de Entrée.

Commentaires (1)

`R peut faire le travail ici pour vous.

Commentaires (0)