Comment remplacer un personnage par une nouvelle ligne dans Vim?

J’essaie de remplacer chacun dans le fichier actuel par une nouvelle ligne:

 :%s/,/\n/g 

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

Que devrais-je faire?

Si vous êtes curieux, comme moi, vérifiez la question Pourquoi \ ra newline pour Vim? ainsi que.

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 . Cependant, lorsque vous recherchez une nouvelle ligne, vous utiliserez toujours \n . Cette asymésortinge est due au fait que \n et \r font des choses légèrement différentes :

\n correspond à une fin de ligne (newline), alors que \r correspond à un retour chariot. En revanche, dans les substitutions, \n insère un caractère nul alors que \r insère une nouvelle ligne (plus précisément, elle est traitée comme l’entrée ). Voici un petit exemple non interactif pour illustrer cela, en utilisant la fonction de ligne de commande Vim (en d’autres termes, vous pouvez copier et coller les éléments suivants 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.

Voici l’astuce:

Tout d’abord, définissez votre session vi (m) pour autoriser la correspondance avec des caractères spéciaux (par exemple: nouvelle ligne). Cela vaut probablement la peine de mettre cette ligne dans votre fichier .vimrc ou .exrc.

 :set magic 

Ensuite, faites:

 :s/,/,^M/g 

Pour obtenir le caractère ^M , tapez Controlv et appuyez sur Entrée . Sous Windows, faites Contrôleq , Entrée . La seule façon dont je peux m’en souvenir est de se rappeler à quel point ils ne sont pas sensés:

A: Quel serait le pire caractère de contrôle à utiliser pour représenter une nouvelle ligne?

B: Soit q (parce que cela signifie généralement “Quit”) ou v parce qu’il serait si facile de saisir Controlc par erreur et de tuer l’éditeur.

Un: le faire ainsi.

Dans la syntaxe s/foo/bar \r et \n ont des significations différentes, selon le contexte.


court:

Pour foo :
\ n = newline (LF sous linux / mac, CRLF sous windows)
\ r = retour chariot (CR)

Pour la bar :
\ r = est newline
\ n = octet nul.

plus longtemps: (avec chiffres ascii)

NUL = 0x00 = 0 = CTRL @
LF = 0x0A = 10 = CTRL J
CR = 0x0D = 13 = CTRL M

Voici une liste des caractères de contrôle ASCII , insérez-les dans vim via CTRL v CTRL --- clé --- .
Dans bash ou les autres shells unix / linux, tapez simplement CTRL --- key --- . Essayez CTRL M dans bash, c’est la même chose que d’appuyer sur ENTER , car le shell réalise ce que l’on veut dire, même si les systèmes linux utilisent des sauts de ligne pour la délimitation des lignes.

Pour insérer des littéraux dans bash, les append à CTRL v fonctionnera également.

Essayez en bash:

 echo ^[[33;1mcolored.^[[0mnot colored. 

Cela utilise les séquences d’échappement ANSI , insérez les deux via les touches CTRL v ESC .

Vous pouvez également essayer CTRL v CTRL m ENTER , qui vous donnera ceci:

 bash: $'\r': command not found 

Rappelez-vous le \r d’en haut? :>

Cette liste de caractères de contrôle ASCII est différente d’une table de symboles ASCII complète, dans laquelle les caractères de contrôle, qui sont insérés dans une console / pseudoterminal / vim via la clé CTRL (haha), peuvent être trouvés ici. Alors qu’en C et dans la plupart des autres langues, vous utilisez généralement les codes octaux pour représenter ces «caractères».

Si vous voulez vraiment savoir d’où vient tout ceci: http://www.linusakesson.net/programming/tty/ .
C’est le meilleur lien que vous rencontrerez sur ce sujet, mais attention: il y a des dragons.


TL; DR

Habituellement, foo = \n et bar = \r .

Vous devez utiliser

 :%s/,/^M/g 

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

\r peut faire le travail ici pour vous.

Avec Vim sous Windows, utilisez Ctrl + Q à la place de Ctrl + V

À partir d’une éclipse, les caractères ^M peuvent être intégrés dans une ligne et vous souhaitez les convertir en nouvelles lignes.

 :s/\r/\r/g 

Mais si on doit substituer alors la chose suivante fonctionne

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

dans la ligne ci-dessus, chaque ligne suivante est remplacée par la ligne suivante, puis | – et encore une ligne suivante. Ceci est utilisé dans les tables wiki. si le texte est comme suit:

 line1 line2 line3 

est changé pour

 line1 |- line2 |- line3 

C’est la meilleure réponse à ma façon, mais cela aurait été mieux dans un tableau: https://stackoverflow.com/a/12389839/962394 .

Donc, reformuler:

Vous devez utiliser \r pour utiliser un 0x0a ligne (ascii 0x0a , le 0x0a unix) dans un remplacement regex, mais cela est particulier au remplacement – vous devriez normalement continuer à utiliser \n pour le \n de ligne et \r pour le retour chariot. .

C’est parce que vim a utilisé \n dans un remplacement pour signifier le caractère NIL (ascii 0x00 ). Vous vous êtes peut-être attendu à ce que NIL ait été \0 place, libérant \n pour son utilisation habituelle pour le saut de ligne, mais \0 déjà un sens dans les remplacements de regex, il a donc été déplacé vers \n . D’où alors aller plus loin pour déplacer également la nouvelle ligne de \n à \r (qui dans un modèle de regex est le caractère de retour chariot, ascii 0x0d ).

 personnage |  code ascii |  Représentation C |  correspondance regex |  remplacement de regex
 ------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
 néant |  0x00 |  \ 0 |  \ 0 |  \ n
 saut de ligne (unix newline) |  0x0a |  \ n |  \ n |  \ r
 retour chariot |  0x0d |  \ r |  \ r |  

NB: ^M (Ctrl-V Ctrl-M sur Linux) insère une nouvelle ligne lorsqu’elle est utilisée dans un remplacement d’expression rationnelle plutôt qu’un retour chariot comme d’autres personnes l’ont conseillé (je viens de l’essayer).

Notez également que vim traduira le caractère de saut de ligne lorsqu’il enregistre dans un fichier en fonction de ses parameters de format de fichier et que cela risque de créer des problèmes.

Si vous devez faire pour un fichier entier, il m’a également été suggéré d’essayer depuis la ligne de commande

 sed 's/\\n/\n/g' file > newfile 

Voici la réponse qui a fonctionné pour moi. De ce gars

—- citant http://jaysonlorenzen.wordpress.com/2009/04/28/use-vi-editor-to-insert-newline-char-in-replace/


Quelque chose d’autre que je dois faire et que je ne peux pas retenir et que je dois ensuite regarder.

Dans vi pour insérer un caractère de nouvelle ligne dans une recherche et le remplacer, procédez comme suit:

:% s / look_for / replace_with ^ M / g la commande ci-dessus remplacera toutes les instances de “look_for” par “replace_with \ n” (avec \ n signifiant newline)

pour obtenir le «^ M», entrez la combinaison de touches «ctl-V» puis, après cela (relâchez toutes les touches), appuyez sur la touche «enter».