Question

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.

Quelle en est la cause et comment puis-je y remédier?

Était-ce utile?

La solution

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.

Autres conseils

Corrigez les fins de ligne dans vi en exécutant ce qui suit:

: set fileformat = unix

: w

La cause 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 utilisent simplement 0x0A (un saut de ligne ). Le ^ M que vous voyez est une représentation visuelle de 0x0D (un retour chariot ).

dos2unix vous aidera à cela. Vous devrez probablement également ajuster la source des scripts pour qu'ils soient compatibles avec Unix.

Le moyen le plus simple consiste à utiliser vi . Je sais que cela semble terrible, mais 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 nom de fichier

Appuyez ensuite sur " : " pour accéder au mode commande.

Rechercher et remplacer tout ce qui est globalement :% s / ^ M // g " M " qui remplacera ^ M par rien.

Ensuite, pour écrire et quitter, entrez " : wq ". Fait!

Essayez d’utiliser dos2unix pour éliminer les ^ M.

Sous vi, effectuez un :% s / ^ M // g

Pour obtenir le ^ M maintenez la touche CTRL enfoncée, appuyez sur V puis sur M touche de commande) et le ^ M apparaîtra. Cela trouvera toutes les occurrences et ne 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 sur la ligne de commande pour résoudre ce problème.

perl -pie 's/\r//g' filename.txt

Le ^ M est généralement causé par les sauts de lignes de l'opérateur Windows et la traduction sur Unix ressemble à un ^ M. La commande dos2unix devrait les supprimer correctement

dos2unix [options] [-c convmode] [fichier -o ...] [-n fichier infilier ...]

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

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

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

Vous pouvez également 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 indiqué % s / ^ M / \ r / g

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

Une alternative à la commande dos2unix serait d'utiliser des utilitaires standard tels que sed .

Par exemple, dos à unix:

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

unix à dos:

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

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

Convertissez les fins de ligne DOS / Windows (\ r \ n) en fins de ligne 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

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

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

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

Mes deux cents

Une autre commande vi qui fera l'affaire: :% s / .$// Ceci supprime le dernier caractère de chaque ligne du fichier. L'inconvénient de cette commande de recherche et de remplacement est qu'il ne tient pas compte du dernier caractère. Veillez donc à ne pas l'appeler deux fois.

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