Que signifie le caractère ^M dans Vim?

Je continue à obtenir ^M caractère dans mon vimrc et il casse ma configuration.

410
demandé sur JohnB 2011-04-30 21:37:24

15 réponses

Unix utilise 0xA pour un caractère de retour à la ligne. Windows utilise une combinaison de deux caractères: 0xD 0xA. 0xD est le caractère de retour chariot. ^M se trouve être la façon dont vim affiche 0xD ( 0x0D = 13, M est la 13ème lettre de l'alphabet anglais).

Vous pouvez supprimer tous les caractères ^M en exécutant les opérations suivantes:

:%s/^M//g

^M est entré en maintenant Ctrl et taper v, suivie par m, puis en relâchant Ctrl. C'est parfois abrégé en ^V^M, mais notez que vous devez l'entrer comme décrit dans la phrase précédente, au lieu de le taper littéralement.

Cette expression remplacera toutes les occurrences de ^M par la chaîne vide (c'est-à-dire rien). Je l'utilise pour me débarrasser de ^M dans les fichiers copiés de Windows vers Unix (Solaris, Linux, OSX).

448
répondu Tomasz Stanczak 2017-10-04 16:54:47
:%s/\r//g 

A travaillé pour moi aujourd'hui. Mais ma situation était légèrement différente.

108
répondu dlk5730 2015-08-31 23:01:31

Pour traduire la nouvelle ligne au lieu de la supprimer:

:%s/\r/\r/g
55
répondu Mori 2014-07-02 23:51:59

Cela signifie probablement que vous avez des retours chariot (différents systèmes d'exploitation utilisent différentes façons de signaler la fin de la ligne).

Utiliser dos2unix pour réparer les fichiers ou définir les formats de fichiers dans vim:

set ffs=unix,dos
36
répondu cnicutar 2011-04-30 17:38:10

Disons que votre fichier texte est-file.txt, puis exécutez cette commande -

dos2unix file.txt 

Il convertit le fichier texte de dos au format unix.

15
répondu akritaag 2015-06-22 17:20:27

Dans Unix, il est probablement plus facile d'utiliser la commande 'tr'.

cat file1.txt | tr "\r" "\n" > file2.txt
6
répondu Irving Rabin 2015-02-13 23:30:58

Je les ai tous enlevés avec sed:

sed -i -e 's/\r//g'

Pourrait également remplacer par une chaîne ou un caractère différent:

sed -i -e 's/\r/string/g'

6
répondu Freedom_Ben 2018-01-24 17:10:51

J'ai obtenu un fichier texte généré à l'origine sur une Machine Windows par le biais D'un utilisateur Mac et j'ai dû l'importer dans une base de données MySQL Linux en utilisant la commande load data.

Bien que VIM ait affiché le caractère '^M', aucun des éléments ci-dessus ne fonctionnait pour mon problème particulier, les données étaient importées mais étaient toujours corrompues d'une manière ou d'une autre. La solution était assez facile à la fin (après beaucoup de frustration).

Solution: Exécution dos2unix deux fois sur le même fichier a fait l'affaire! Utilisation du file commande montre ce qui se passe le long du chemin.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

, Et la version finale du fichier importé parfaitement dans la base de données.

5
répondu Anthony Palmer 2014-11-21 17:12:52

Vous pouvez résoudre ce problème dans vim en utilisant

:1,$s/^V^M//g

Où ^ est le caractère de contrôle.

4
répondu Scott C Wilson 2011-04-30 17:39:20

Si cela casse votre configuration, et que les caractères ^M sont requis dans les mappages, vous pouvez simplement remplacer les caractères ^m par <Enter> ou même <C-m> (les deux tapés comme des séquences de caractères simples, donc 7 et 5 caractères, respectivement).

C'est la seule façon recommandée et portable de stocker des keycodes spéciaux dans les mappages

2
répondu sehe 2011-04-30 18:23:31

Sous FreeBSD, vous pouvez effacer le ^M manuellement en tapant ce qui suit:

:%s/ Ctrl+V, puis Ctrl+M, puis Ctrl+M nouveau.

2
répondu Victor Ong 2014-10-20 13:52:51

C'est la seule chose qui a fonctionné dans mon cas:

:e ++ff=dos

:wq

2
répondu Sardeep Lakhera 2018-02-01 19:35:03

J'ai découvert que je pollue des fichiers depuis des semaines en raison du fait que mon instance Homebrew Mvim a été définie pour utiliser filetype = dos. Fait le changement requis dans .vimrc....

0
répondu nichg 2015-06-24 16:56:46

Essayez :%s/\^M// au moins cela a fonctionné pour moi.

0
répondu xuc 2017-04-19 20:31:15

Si vous n'avez pas spécifié intentionnellement un fileformat différent (par exemple, :e ++ff=unix pour un fichier Windows), il est probable que le fichier cible a des EOLs mixtes.

Par exemple, si un fichier a des lignes avec des terminaisons <CR><NL> et d'autres avec <NL> Terminaisons, et fileformat est défini sur unix automatiquement par Vim lors de la lecture, ^M (<CR>) apparaîtra. Dans de tels cas, fileformats entre en jeu. Voir :help ffs pour les détails.

0
répondu ebk 2017-11-17 01:55:54