Question Comment remplacer un caractère par un saut de ligne dans Vim?


J'essaie de remplacer chaque , 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 réelle. Le fichier n'est pas en mode DOS ou quoi que ce soit.

Que devrais-je faire?

Si vous êtes curieux, comme moi, vérifiez la question Pourquoi est-ce une nouvelle ligne pour Vim? ainsi que.


1587
2017-09-16 11:19


origine


Réponses:


Utilisation \r au lieu de \n.

Substitution par \n insère un caractère nul dans le texte. Pour obtenir un retour à la ligne, utilisez \r. Quand recherche pour un retour à la ligne, vous utiliseriez toujours \n, toutefois. Cette asymétrie est due au fait que \n et \r  faire des choses légèrement différentes:

\n correspond à une fin de ligne (nouvelle ligne), alors que \r correspond à un retour chariot. D'un autre côté, 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 <CR>). 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 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.


2074
2017-09-16 11:21



Voici l'astuce:

Tout d'abord, définissez votre session vi (m) pour permettre la correspondance de formes avec des caractères spéciaux (ex: newline). Cela vaut probablement la peine de placer cette ligne dans votre fichier .vimrc ou .exrc.

:set magic

Ensuite, faites:

:s/,/,^M/g

Pour obtenir le ^M caractère, type Contrôle-v et frapper Entrer. Sous Windows, faites Contrôle-q, Entrer. La seule façon dont je peux m'en souvenir est de me souvenir du peu de sens qu'ils font:

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

B: Non plus q (parce que cela signifie généralement "Quitter") ou v parce que ce serait si facile à taper Contrôle-c par erreur et tuer l'éditeur.

UNE: Faire en sorte.


166
2017-09-25 23:40



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


Pour foo:
\ n = nouvelle ligne
\ r = CR (retour chariot = Ctrl-M = ^ M)

Pour bar:
\ r = est nouvelle ligne
\ n = octet nul (0x00).


J'ai vu des questions sur de telles choses assez souvent dans le passé, et dans le futur, presque personne ne saura quoi que ce soit à propos de ça ...

Par demande "populaire":

Voici une liste des Caractères de contrôle ASCII, insérez-les dans vim via CTRLvCTRL---clé---.
Dans bash ou les autres coquilles unix / linux juste taper CTRL---clé---. Essayer CTRLM à bash, c'est la même chose que de frapper ENTRER, car l'interpréteur réalise ce que l'on veut dire, même si les systèmes linux utilisent des flux de ligne pour la délimitation de ligne. Juste le caractère de contrôle pour Line Feed est CTRL-A, qui est lié à «sauter au début de la ligne» dans bash.

Pour insérer littéral dans bash, CTRLv travaillera aussi.

Essayez bash:

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

Cela utilise Séquences d'échappement ANSI, insérez les deux ^[de via CTRLvESC.

Vous pourriez aussi essayer CTRLvCTRLmENTRER, qui vous donnera ceci:

bash: $'\r': command not found

Se souvenir du \r d'en haut? :>

le Caractères de contrôle ASCII la liste est différente de la norme table de symbole ascii, en ce que les caractères de contrôle, qui sont insérés dans une console / pseudoterminal / vim via le CTRL clé (haha), peut être trouvé là. 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ù tout cela vient: 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.


65
2017-09-23 14:00



Vous devez utiliser

:%s/,/^M/g

Pour obtenir le ^M caractère, appuyez sur Ctrl  v suivi par Entrer


45
2017-09-16 11:30



\r peut faire le travail ici pour vous.


27
2017-09-16 11:21



Avec Vim sur Windows Ctrl+Q au lieu de Ctrl+V


20
2017-09-16 11:45



De l'éclipse, le ^M Les caractères peuvent être incorporés dans une ligne et vous souhaitez les convertir en saut de ligne.

:s/\r/\r/g

8
2017-09-06 17:53



Mais si l'on doit substituer alors la chose suivante fonctionne

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

dans le dessus, chaque ligne suivante est remplacée par la ligne suivante, puis | - et de nouveau par une ligne suivante. Ceci est utilisé dans les tables wiki. si le texte est le suivant:

line1
line2
line3

est changé en

line1
|-
line2
|-
line3

5
2018-02-07 08:09



C'est la meilleure réponse pour la façon dont je pense, mais cela aurait été plus agréable dans une table: https://stackoverflow.com/a/12389839/962394.

Donc, reformulation:

Vous devez utiliser \r utiliser un saut de ligne (ASCII 0x0a, le newline unix) dans un remplacement de regex, mais qui est particulier au remplacement - vous devriez normalement continuer à s'attendre à utiliser \n pour le saut de ligne et \r pour le retour du chariot.

C'est parce que vim utilisé \n dans un remplacement pour signifier le caractère NIL (ascii 0x00). Vous pourriez vous attendre à ce que NIL ait été \0 au lieu de libérer \n pour son utilisation habituelle pour les sauts de ligne, mais \0 a déjà une signification dans les remplacements regex donc il a été déplacé vers \n. Par conséquent, aller plus loin pour déplacer également la nouvelle ligne de \n à \r (qui dans un modèle regex est le caractère de retour chariot, ASCII 0x0d).

caractère | code ascii | Représentation C | match regex | remplacement de regex
------------------------- + ------------ + ----------- ------- + ------------- + ------------------------
nul 0x00 | \ 0 | \ 0 | \ n
saut de ligne (nouvelle ligne unix) | 0x0a | \ n | \ n | \ r
retour de chariot | 0x0d | \ r | \ r | <inconnu>

NB: ^M (Ctrl-V Ctrl-M sur linux) insère une nouvelle ligne quand elle est utilisée dans un remplacement d'expression rationnelle plutôt qu'un retour chariot comme d'autres l'ont conseillé (je l'ai juste essayé).

Notez également que vim traduira le caractère de saut de ligne lors de l'enregistrement dans le fichier en fonction de ses paramètres de format de fichier, ce qui peut créer des problèmes.


5
2018-04-08 12:15



Si vous devez faire pour un fichier entier, il m'a aussi été suggéré que vous pourriez essayer depuis la ligne de commande

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

4
2018-02-09 23:01