Lorsque j'exécute un script SQL particulier dans des environnements Unix, je vois un caractère «^ M» à la fin de chaque ligne du script SQL lorsqu'il est renvoyé à 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 ce problème et comment y remédier?
sql
unix
newline
line-endings
os-dependent
Paul Reiners
la source
la source
brew install dos2unix
lorsque vous avez installé homebrewCorrigez les fins de ligne en
vi
exécutant ce qui suit::set fileformat=unix
:w
la source
^M
s pour une raison quelconque. fichier de référence:/etc/timidity/fluidr3_gm.cfg
.La cause est la différence entre la façon dont un système d'exploitation Windows et un système d'exploitation Unix stockent 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 simplement0x0A
(un saut de ligne ). Le^M
que vous voyez est une représentation visuelle de0x0D
(un retour chariot ).dos2unix vous aidera avec cela. Vous devrez probablement aussi ajuster la source des scripts pour être «compatible Unix».
la source
^M
? Pourquoi le «^»? Pourquoi le «M»?Le moyen le plus simple est d'utiliser
vi
.Je sais que cela semble terrible mais c'estsimple et déjà installé sur la plupart des environnements UNIX. ^ M est une nouvelle ligne de l'environnement Windows / DOS.à partir de l'invite de commande:
$ vi filename
Appuyez ensuite sur "
:
" pour accéder au mode commande.Rechercher et tout remplacer globalement est
:%s/^M//g
" Appuyez et maintenez la commande puis appuyez sur V puis M " qui remplacera ^ M par rien.Ensuite, pour écrire et quitter, entrez "
:wq
" Terminé!la source
Essayez d'utiliser dos2unix pour retirer le ^ M.
la source
Dans vi, faites un
:%s/^M//g
Pour
^M
maintenir la CTRLtouche enfoncée, appuyez sur Vpuis M(Les deux tout en maintenant la touche de contrôle) et le^M
apparaîtra. Cela trouvera toutes les occurrences et les remplacera par rien.la source
:%s/^M/\r/g
Le script SQL a été créé à l'origine sur un système d'exploitation Windows. Les caractères «^ M» sont le résultat 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.
la source
Le ^ M est généralement causé par les nouvelles lignes de l'opérateur Windows et traduit sous Unix ressemble à un ^ M. La commande dos2unix devrait bien les supprimer
dos2unix [options] [-c convmode] [-o fichier ...] [-n fichier fichier ...]
la source
Sed est encore plus largement disponible et peut faire ce genre de chose aussi si dos2unix n'est pas installé
Vous pouvez également essayer tr:
Voici les résultats:
la source
Pour remplacer les caractères ^ M dans l'éditeur vi, utilisez ci-dessous
ouvrez le fichier texte, dites t1.txt
Entrez en mode commande en appuyant sur
shift + :
puis appuyez sur les touches comme indiqué
%s/^M/\r/g
la source
Une alternative à la
dos2unix
commande consisterait à utiliser des utilitaires standard commesed
.Par exemple, dos à unix:
unix à dos:
la source
Vous pouvez supprimer ^ M des fichiers directement via la commande sed, par exemple:
Si vous êtes satisfait des modifications, supprimez les fichiers .bak:
la source
Convertissez les fins de ligne DOS / Windows (\ r \ n) en fins de ligne Unix (\ n), avec tr:
Article sur le remplacement des nouvelles lignes depuis la ligne de commande Unix
la source
od -a $file
est utile pour explorer ces types de questions sous Linux (similaire à dumphex ci-dessus).la source
En Perl, si vous ne voulez pas définir la variable $ / et utiliser chomp (), vous pouvez également faire:
Mes deux centimes
la source
Une autre commande vi qui fera l'affaire:
:%s/.$//
Cela supprime le dernier caractère de chaque ligne du fichier. L'inconvénient de cette commande de recherche et de remplacement est qu'elle ne se soucie pas du dernier caractère, alors faites attention de ne pas l'appeler deux fois.la source