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?
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.
Corrigez les fins de ligne dans vi
en lançant:
:set fileformat=unix
:w
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.
Le moyen le plus simple consiste à utiliser vi
. Je 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é!
Essayez d’utiliser dos2unix pour déshabiller le ^ M.
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.
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
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 ...]
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.
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)
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
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
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
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
od -a $file
est utile pour explorer ces types de questions sous Linux (similaire à dumphex ci-dessus).