web-dev-qa-db-fra.com

Caractère '^ M' à la fin des lignes

Lorsque j'exécute un script SQL particulier dans les environnements Unix, je vois un caractère '^ M' à la fin de chaque ligne du script SQL, car il est répercuté sur la ligne de commande. Je ne sais pas sur quel système d'exploitation le script SQL a été créé à l'origine.

Qu'est-ce qui cause cela et comment puis-je le réparer?

97
Paul Reiners

Cela est dû aux caractères de fin de ligne DOS/Windows. Comme Andy Whitfield l'a dit, la commande Unix dos2unix aidera à résoudre le problème. Si vous souhaitez plus d'informations, vous pouvez lire les pages de manuel de cette commande.

77
Thomas Owens

Corrigez les fins de ligne dans vi en lançant:

:set fileformat=unix

:w

74
Tim Abell

La cause en est la différence entre la manière dont un système d'exploitation basé sur Windows et un système d'exploitation basé sur Unix stocke les marqueurs de fin de ligne.

Les systèmes d'exploitation Windows, grâce à leur héritage DOS, stockent une fin de ligne sous forme de paire de caractères - 0x0D0A (retour chariot + saut de ligne). Les systèmes d'exploitation basés sur Unix n'utilisent que 0x0A _ (a saut de ligne ). Le ^M que vous voyez est une représentation visuelle de 0x0D _ (a retour chariot ).

dos2unix aidera avec ceci. Vous aurez probablement aussi besoin d'ajuster la source des scripts pour qu'elle soit compatible avec Unix.

39
ColinYounger

Le moyen le plus simple consiste à utiliser viJe sais que ça a l'air terrible mais C'est simple et déjà installé sur la plupart des environnements UNIX. Le ^ M est une nouvelle ligne de l'environnement Windows/DOS.

à partir de l'invite de commande: $ vi filename

Puis appuyez ": "pour passer en mode commande.

Rechercher et remplacer tout globalement est :%s/^M//g "Maintenez enfoncée la touche de contrôle puis appuyez sur V puis sur M" qui remplacera ^ M par rien.

Puis pour écrire et quitter entrez ":wq" Terminé!

24
Bernie Perez

Essayez d’utiliser dos2unix pour déshabiller le ^ M.

13
Andy Whitfield

Dans vi, faites un :%s/^M//g

Pour obtenir le ^M tenez le CTRL appuyez sur la touche V puis M (Les deux en maintenant la touche de commande enfoncée) et le ^M apparaîtra. Cela trouvera toutes les occurrences et les remplacera par rien.

9
dogbane

Le script SQL a été créé à l'origine sur un système d'exploitation Windows. Les caractères '^ M' résultent du fait que Windows et Unix ont des idées différentes sur ce qu'il faut utiliser pour un caractère de fin de ligne. Vous pouvez utiliser Perl en ligne de commande pour résoudre ce problème.

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

Le ^ M est généralement provoqué par les nouvelles lignes de l'opérateur Windows, et traduit sur Unix ressemble à un ^ M. La commande dos2unix devrait les supprimer correctement

dos2unix [options] [-c convmode] [-o fichier ...] [-n infile outfile ...]

7
jW.
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed est encore plus largement disponible et peut faire ce genre de choses aussi si dos2unix n’est pas installé

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Vous pouvez aussi essayer tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Voici les résultats:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  
5
JGurtz

Pour remplacer ^ M caractères dans l'éditeur vi utiliser ci-dessous

ouvrez le fichier texte dit t1.txt

vi t1.txt

Entrez en mode commande en appuyant sur shift + :

puis appuyez sur les touches comme mentionné %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
4

Une alternative à dos2unix La commande utiliserait des utilitaires standard comme sed.

Par exemple, dos à unix:

sed 's/\r$//' dos.txt > unix.txt

unix à dos:

sed 's/$/\r/' unix.txt > dos.txt
3
g4th

Convertissez les fins de lignes DOS/Windows (\ r\n) en fins de lignes Unix (\ n), avec tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Message sur le remplacement des nouvelles lignes à partir de la ligne de commande Unix

1
Mason Wright

Vous pouvez supprimer ^ M des fichiers directement via la commande sed, par exemple:

sed -i'.bak' s/\r//g *.*

Si les modifications vous conviennent, supprimez les fichiers .bak:

rm -v *.bak
1
kenorb

En Perl, si vous ne voulez pas définir la variable $/et utiliser chomp (), vous pouvez aussi faire:

$var =~ /\r\n//g;

Mes deux centimes

0
Ariel Monaco

od -a $file est utile pour explorer ces types de questions sous Linux (similaire à dumphex ci-dessus).

0
Allan Wind