Dans l'éditeur vim, je veux remplacer un caractère de nouvelle ligne (\ n) par deux nouveaux caractères de ligne (\ n\n) en utilisant le mode de commande vim.
Contenu du fichier d'entrée:
This is my first line.
This is second line.
Commande que j'ai essayée:
:%s/\n/\n\n/g
il remplace la chaîne par des caractères indésirables comme
This is my first line.^@^@This is second line.^@^@
J'ai ensuite essayé la commande suivante
:%s/\n/\r\r/g
Cela fonctionne correctement. Pouvez-vous expliquer pourquoi cela fonctionne bien avec la deuxième commande?
Curieusement, \n
dans vim pour le remplacement ne signifie pas une nouvelle ligne, mais null. ASCII nul est ^@
(control@).
Historiquement, vi remplace ^M
(controlM) comme fin de ligne, qui est la nouvelle ligne. vim a ajouté une extension \r
(comme le langage C) signifie la même chose que ^M
, mais les développeurs ont choisi de faire \n
signifie null lorsque remplace le texte. Ceci est incompatible avec son utilisation dans les recherches , qui trouvent une nouvelle ligne.
Lectures complémentaires:
Essaye ça: %s/$/^V^M/
(où ^V
est Ctrl-V
et ^M
est Ctrl-M
- lorsque vous tapez ^V
il imprimera un ^
char puis retour arrière dessus et puis quand vous tapez ^M
il apparaîtra comme ^M
... le Ctrl-V est le tty standard littéral suivant caractère - exécutez la commande stty -a
pour afficher les caractères spéciaux de votre tty).
vim
utilisez \n
pour représenter un caractère nul \0
en mémoire, que la façon dont vim
gère le fichier contient un caractère nul (tandis que vi
ne peut pas).
L'utilisation de \n
ne correspond qu'à la fin de la ligne dans le tampon, pas la nouvelle ligne dans la chaîne lors de l'utilisation de l'expression.
Voir : h NL-used-for-Null et : h CR-used-for-NL pour plus de détails.
Testé avec les versions Neovim (nvim
) et Vim
NVIM v0.3.0
VIM - Vi IMproved 8.1
Supprimer une nouvelle ligne:
cell
allele
rs2981578
fgfr2
Ici, \n
correspond aux sauts de ligne (à insérer un saut de ligne cependant, utilisez \r
):
:'<,'>s/\n/|/g
cell|allele|rs2981578|fgfr2
Ajoutez une nouvelle ligne:
Nan:
cell|allele|rs2981578|fgfr2
:'<,'>s/\n/|/g
cell^@allele^@rs2981578^@fgfr2
^@
est une marque diacritique pour LF (saut de ligne; voir http://vimhelp.appspot.com/digraph.txt.html#digraphs-default )
Oui:
cell|allele|rs2981578|fgfr2
:'<,'>s/|/\r/g
cell
allele
rs2981578
fgfr2
Pour répondre à la question du PO (comment remplacer un \n
avec deux, \n\n
), ajoutez simplement un autre \r
:
cell
allele
rs2981578
fgfr2
:'<,'>s/\n/\r\r/g
cell
allele
rs2981578
fgfr2
... c'est-à-dire correspondre à la nouvelle ligne d'origine (\n
), et remplacez-le par deux retours à la ligne/retours chariot (\r\r
).