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

34

Dans l'éditeur vim, je souhaite remplacer un caractère de nouvelle ligne (\ n) par deux nouveaux caractères de ligne (\ n \ n) à l'aide du 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.^@^@

Puis j'ai essayé la commande suivante

:%s/\n/\r\r/g

Cela fonctionne correctement. Pouvez-vous expliquer pourquoi cela fonctionne bien avec la deuxième commande?

Raghvendra
la source
Voir aussi unix.stackexchange.com/a/206404
Stéphane Chazelas
2
FYI: Il y a aussi un Vi et Vim (beta) SE .
Dubu
2
Note de côté, vous ne devez pas utiliser /comme séparateur. C'est plus lisible::%s;\n;\n\n;g
DJMcMayhem
1
Rechercher \n, remplacer par \r\r, :% s/\n/\r\r/g: stackoverflow.com/a/71334/911945
Anton Tarasenko

Réponses:

47

Curieusement, \nvim for replacement ne signifie pas newline, mais null. ASCII nul est ^@( control@).

Historiquement, vi remplace ^M( controlM) en tant que fin de ligne, qui est la nouvelle ligne. vim a ajouté une extension \r(comme le langage C) pour signifier la même chose que ^M, mais les développeurs ont choisi de donner la \nvaleur null en remplaçant le texte. Ceci est incompatible avec son utilisation dans les recherches , qui trouvent une nouvelle ligne.

Lectures complémentaires:

Thomas Dickey
la source
7

Essayez ceci: %s/$/^V^M/(où ^Vest Ctrl-Vet ^Mest Ctrl-M- lorsque vous tapez ^V, un caractère apparaît, ^puis un retour arrière au-dessus de celui-ci, puis, lorsque vous tapez, ^Mil apparaît sous la forme ^M... le caractère Ctrl-V est le caractère littéral standard standard - exécutez la commande stty -apour montrer les caractères spéciaux de votre tty).

Murray Jensen
la source
En effet, les personnes très expérimentées le sauront lors de la conversion toujours nécessaire de CRLF au lieu d’abandonner leurs études et d’utiliser dos2unix ou similaire. L'utilisation de Ctrl-V est une leçon du jour 1 vi.
mckenzm
5

vimutiliser \npour représenter un caractère nul \0en mémoire, que le vimfichier handle contienne un caractère nul (alors que vine peut pas).

Utilisation de la \ncorrespondance uniquement en fin de ligne dans la mémoire tampon, pas de 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.

cuonglm
la source
1

Testé avec Neovim ( nvim) et ses Vimversions

NVIM v0.3.0
VIM - Vi IMproved 8.1

Supprimer une nouvelle ligne:

cell
allele
rs2981578
fgfr2

Ici, \ncorrespond à la nouvelle ligne (pour insérer une nouvelle ligne, cependant, utilisez \r):

:'<,'>s/\n/|/g

cell|allele|rs2981578|fgfr2

Ajouter une nouvelle ligne:

Nan:

cell|allele|rs2981578|fgfr2

:'<,'>s/\n/|/g

cell^@allele^@rs2981578^@fgfr2

^@est un signe 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 \npar deux, \n\n), ajoutez-en une 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 la remplacer par deux nouvelles lignes / retours à la ligne ( \r\r).

Victoria Stuart
la source