Question

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’un retour à la ligne réel. Le fichier n'est pas en mode DOS ou quoi que ce soit.

Que dois-je faire?

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

Était-ce utile?

La solution

Utilisez \r au lieu de \n.

La substitution par xxd insère un caractère nul dans le texte. Pour obtenir une nouvelle ligne, utilisez <=>. Lorsque vous recherchez une nouvelle ligne, vous & # 8217; utilisez toujours <=>, cependant. Cette asymétrie est due au fait que <=> et <=> font des choses légèrement différentes :

<=> correspond à une fin de ligne (nouvelle ligne), tandis que <=> correspond à un retour à la ligne. Par contre, dans les substitutions <=> insère un caractère nul alors que <=> insère une nouvelle ligne (plus précisément, elle & # 8217; est traitée comme l’entrée & Lt; CR & Gt ; ). Voici & # 8217; Voici un petit exemple non interactif illustrant cette opération à l’aide de 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). <=> affiche 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, <=> a inséré l'octet 0x00 dans le texte; <=> a inséré l'octet 0x0a.

Autres conseils

Voici le truc:

Tout d'abord, configurez votre session vi (m) pour autoriser la correspondance de motifs avec des caractères spéciaux (par exemple: nouvelle ligne). Il 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 Contrôle - v et appuyez sur Entrée . Sous Windows, effectuez Contrôle - q , Entrée . La seule façon dont je puisse me souvenir de cela est de rappeler à quel point ils ont peu de sens:

  

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

     

B: Soit q (car cela signifie généralement & "Quitter &";) ou v car il serait si facile de taper Contrôle - c par erreur et tuer l'éditeur.

     

A: Faites-le ainsi.

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

court:

Pour foo:
\ n = nouvelle ligne (LF sous linux / mac, CRLF sous Windows)
\ r = retour chariot (CR)

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

plus long: (avec des nombres 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érés 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, cela revient à frapper ENTREE , car le shell réalise ce que cela signifie, même si les systèmes Linux utilisent Line Feeds pour délimitation de ligne.

Pour insérer des littéraux dans bash, ajoutez-les au préalable avec CTRL v fonctionnera également.

Essayez en bash:

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

Ceci utilise séquences d'échappement ANSI , insère les deux ^[ via CTRL v ESC .

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

bash: $'\r': command not found

Rappelez-vous le <=> vu d’en haut? : >

Cette liste des caractères de contrôle ASCII est différente d'un < a href = "http://ascii-code.com/" rel = "noreferrer"> Table des symboles ASCII , en ce sens que les caractères de contrôle sont insérés dans une console / pseudoterminal / vim via le CTRL (haha), peut être trouvé ici. Tandis qu'en C et dans la plupart des autres langues, vous utilisez habituellement les codes octaux pour représenter ces "caractères".

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

TL; DR

Habituellement <=> = <=> et <=> = <=>.

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.

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

C’est la meilleure réponse, mais cela aurait été plus agréable dans un tableau: https://stackoverflow.com / a / 12389839/962394 .

Donc, reformulez:

Vous devez utiliser \r pour utiliser un saut de ligne (ascii 0x0a, la nouvelle ligne unix) dans un remplacement regex, mais cela est propre au remplacement - vous devez normalement continuer à vous attendre à utiliser \n pour ligne feed et 0x00 pour le retour chariot.

Cela est dû au fait que vim a utilisé \0 dans un remplacement pour désigner le caractère NIL (ascii 0x0d). Vous auriez peut-être pensé que NIL était ^M à la place, libérant ainsi <=> son utilisation habituelle pour le saut de ligne, mais <=> ayant déjà une signification dans le remplacement des expressions rationnelles, il a été déplacé vers <=>. Par conséquent, il faut donc aller plus loin et déplacer également la nouvelle ligne de <=> à <=> (ce qui, dans un motif regex, correspond au caractère de retour chariot, ascii <=>).

character                | ascii code | C representation | regex match | regex replacement
-------------------------+------------+------------------+-------------+------------------------
nil                      | 0x00       | \0               | \0          | \n
line feed (unix newline) | 0x0a       | \n               | \n          | \r
carriage return          | 0x0d       | \r               | \r          | <unknown>

NB: <=> (Ctrl-V Ctrl-M sous Linux) insère une nouvelle ligne lorsqu’elle est utilisée dans un remplacement d’expression régulière plutôt que dans 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 lorsqu’il sera enregistré dans un fichier en fonction de ses paramètres de format de fichier, ce qui pourrait semer la confusion.

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

:s/\r/\r/g

Mais si on doit substituer alors ce qui suit fonctionne

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

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 remplacé par

line1
|-
line2
|-
line3

Si vous avez besoin de faire pour tout un fichier, il m'a également été suggéré d'essayer à partir de la ligne de commande

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

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

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

Autre chose que je dois faire et dont je ne me souviens plus et que je dois ensuite lever les yeux.

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 remplacerait toutes les instances de & # 8220; look_for & # 8221; avec & # 8220; replace_with \ n & # 8221; (avec \ n signifiant nouvelle ligne)

pour obtenir le & # 8220; ^ M & # 8221 ;, entrez la combinaison de touches & # 8220; ctl-V & # 8221; puis après cela (relâchez toutes les touches), appuyez sur & # 8220; entrez & # 8221; clé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top