web-dev-qa-db-fra.com

Vim - comment remplacer une nouvelle ligne \ n par deux \ n

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?

40
Raghvendra

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:

52
Thomas Dickey

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).

7
Murray Jensen

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.

6
cuonglm

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).

2
Victoria Stuart