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 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, consultez la question Pourquoi est-ce que \ ra newline pour Vim? ainsi que.
Réponses:
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, lors de la recherche d'une nouvelle ligne, vous utiliseriez toujours\n
. 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 qu'il\r
correspond à un retour chariot. En revanche, dans les substitutions,\n
un caractère nul est\r
inséré tandis qu'un caractère de nouvelle ligne est inséré (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.En d'autres termes,
\n
a inséré l'octet 0x00 dans le texte;\r
a inséré l'octet 0x0a.la source
\r
ne fonctionne pas comme ça. Mais vous pouvez appuyer surCtrl-V
Enter
au lieu de taper\r
, et cela fonctionne.\r
insère<CR>
et\n
insère un null, comment pourrais-je remplacer quelque chose par un retour chariot?Voici l'astuce:
Tout d'abord, définissez votre session Vi (m) pour autoriser la correspondance de motifs 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:
Ensuite, faites:
Pour obtenir le
^M
personnage, tapez Ctrl+ Vet appuyez sur Enter. Sous Windows, faire Ctrl+ Q, Enter. La seule façon dont je peux m'en souvenir est de me souvenir du peu de sens qu'ils ont:la source
:set magic
(ce n'est pas dans mon ~ / _vimrc non plus) ouctrl-q
. Juste un simplectrl-v
suivi d'une entrée crée le^M
personnage pour moi très bien.Ctrl-C
ne tue pas réellement l'éditeur, bien qu'il puisse vous annuler en mode normal.Ctrl-V
signifie textuellement etCtrl-Q
signifie que quelqu'un a fait l'erreur de charger le$VIMRUNTIME/mswin.vim
fichier de configuration. Vous n'avez pas besoin de mswin. Utilisez simplement votre propre vimrc à la place.sed -n l
jusqu'à présent. Bon à savoir que la même chose peut être obtenue avecCtrl-v
in vim.Dans la syntaxe
s/foo/bar
,\r
et\n
ont des significations différentes, selon le contexte.Court:
Pour
foo
:\ n = nouvelle ligne (LF sur Linux / Mac, CR + LF sur Windows)
\ r = retour chariot (CR)
Pour
bar
:\ r = est une nouvelle ligne
\ n = octet nul.
Plus long (avec des nombres ASCII):
NUL
= 0x00 = 0 = Ctrl+ @LF
= 0x0A = 10 = Ctrl+ JCR
= 0x0D = 13 = Ctrl+MVoici une liste des caractères de contrôle ASCII . Insérez-les dans Vim via Ctrl+ V, Ctrl+ ---key---.
Dans Bash ou les autres shells Unix / Linux, tapez simplement Ctrl+ ---key---.
Essayez Ctrl+ Mdans Bash. C'est la même chose que frapper 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 délimiter les lignes.
Pour insérer des littéraux dans bash, les ajouter avec Ctrl+ Vfonctionnera également.
Essayez dans Bash:
Cela utilise des séquences d'échappement ANSI . Insérer les deux
^[
« s via Ctrl+ V, Esc.Vous pouvez également essayer Ctrl+ V, Ctrl+ M, Enterqui vous donnera ceci:
Rappelez-vous
\r
d'en haut? :>Cette liste de caractères de contrôle ASCII est différente d'une table de symboles ASCII complète , en ce que les caractères de contrôle, qui sont insérés dans une console / pseudoterminal / Vim via la Ctrlclé (haha), peuvent y être trouvés.
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: le TTY démystifié . C'est le meilleur lien que vous rencontrerez sur ce sujet, mais attention: il y a des dragons.
TL; DR
Habituellement
foo
=\n
, etbar
=\r
.la source
:s/x/^M/g
devrait faire l'affaire. Insérez le^M
viactrl-v
suivi dectrl-m
.Vous devez utiliser:
Pour obtenir le
^M
personnage, appuyez sur Ctrl+ vsuivi de Enter.la source
\r
peut faire le travail ici pour vous.la source
Avec Vim sur Windows, utilisez Ctrl+ Qà la place de Ctrl+ V.
la source
C'est la meilleure réponse pour la façon dont je pense, mais cela aurait été plus agréable dans un tableau:
Pourquoi \ ra newline pour Vim?
Donc, reformulation:
Vous devez utiliser
\r
pour utiliser un saut de ligne (ASCII0x0A
, la nouvelle ligne Unix) dans un remplacement regex, mais cela est particulier au remplacement - vous devez normalement continuer à vous attendre à utiliser\n
pour le saut de ligne et\r
pour le retour chariot.C'est parce que Vim utilisé
\n
dans un remplacement pour signifier le caractère NIL (ASCII0x00
). Vous pourriez vous attendre à ce que NIL l'ait été à la\0
place, libérant\n
son utilisation habituelle pour le saut de ligne, mais ayant\0
déjà une signification dans les remplacements d'expressions régulières, il a donc été déplacé vers\n
. Par conséquent, aller plus loin pour déplacer également la nouvelle ligne de\n
à\r
(qui dans un motif d'expression régulière est le caractère de retour chariot, ASCII0x0D
).NB:
^M
( Ctrl+ V Ctrl+ Msous Linux) insère un retour à la ligne lorsqu'il est utilisé dans un remplacement regex plutôt qu'un retour chariot comme d'autres l'ont conseillé (je viens de l'essayer).Notez également que Vim traduira le caractère de saut de ligne lors de l'enregistrement dans un fichier en fonction de ses paramètres de format de fichier et que cela pourrait prêter à confusion.
la source
Depuis Eclipse , les
^M
personnages peuvent être intégrés dans une ligne et vous souhaitez les convertir en nouvelles lignes.la source
Mais si l'on doit remplacer, alors la chose suivante fonctionne:
Dans ce qui précède, chaque ligne suivante est remplacée par la ligne suivante, puis
|-
une nouvelle ligne. Ceci est utilisé dans les tables wiki.Si le texte est le suivant:
Il est remplacé par
la source
Si vous devez le faire pour un fichier entier, il m'a également été suggéré d'essayer à partir de la ligne de commande:
la source
printf 'foo\\nbar\n' | sed 's/\\n/\n/g'
de voir si cela fonctionnera sur votre système. (Nous remercions les bonnes personnes de #bash sur freenode pour cette suggestion.)Voici la réponse qui a fonctionné pour moi. De ce type:
---- citation Utilisez l'éditeur vi pour insérer un caractère de nouvelle ligne en remplacement
Quelque chose d'autre que je dois faire et dont je ne me souviens pas, puis je dois lever les yeux.
Dans vi, pour insérer un caractère de nouvelle ligne dans une recherche et remplacer, procédez comme suit:
La commande ci-dessus remplacerait toutes les instances de «look_for» par «replace_with \ n» (avec \ n signifiant newline).
Pour obtenir le «^ M», entrez la combinaison de touches Ctrl+ V, puis appuyez sur la Entertouche (relâchez toutes les touches) .
la source