UNIX環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の最後に「^ M」文字が表示され、コマンドラインにエコーされます。SQLスクリプトが最初に作成されたOSがわかりません。
何が原因で、どうすれば修正できますか?
UNIX環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の最後に「^ M」文字が表示され、コマンドラインにエコーされます。SQLスクリプトが最初に作成されたOSがわかりません。
何が原因で、どうすれば修正できますか?
回答:
DOS / Windowsの行末文字が原因です。Andy Whitfieldが言ったように、Unixコマンドdos2unixは問題の修正に役立ちます。詳細については、そのコマンドのマニュアルページを参照してください。
brew install dos2unix
自作をインストールしている場合、OSXでこのツールを非常に簡単に入手できます
vi
次のコマンドを実行して、行末を修正します。
:set fileformat=unix
:w
^M
、何らかの理由でsを削除しません。参照ファイル:/etc/timidity/fluidr3_gm.cfg
。
原因は、WindowsベースのOSとUnixベースのOSが行末マーカーを格納する方法の違いです。
Windowsベースのオペレーティングシステムは、そのDOSの伝統のおかげで、行末を1組の文字0x0D0A
(キャリッジリターン+ラインフィード)として保存します。Unixベースのオペレーティングシステムは0x0A
(改行)を使用します。表示され^M
ているのは、0x0D
(復帰)を視覚的に表したものです。
dos2unixはこれに役立ちます。また、おそらくスクリプトのソースを「Unixフレンドリー」に調整する必要があります。
^M
ですか?なぜ「^」なのか?なぜ「M」なのか?
最も簡単な方法はを使用することvi
です。ひどい音に聞こえるかもしれませんが、簡単で、ほとんどのUNIX環境にすでにインストールされています。^ Mは、Windows / DOS環境からの新しいラインです。
コマンドプロンプトから: $ vi filename
次に、「:
」を押してコマンドモードにします。
すべてをグローバルに検索して置換するには、:%s/^M//g
「コントロールを押し続けてからVを押してからMを押します」とすると、^ Mは何も置換されません。
次に、「:wq
」と入力して終了します。
dos2unixを使用して^ Mを削除してください。
SQLスクリプトは、もともとWindows OSで作成されました。'^ M'文字は、WindowsとUnixが行末文字に何を使用するかについて異なる考えを持っている結果です。コマンドラインでperlを使用してこれを修正できます。
perl -pie 's/\r//g' filename.txt
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
Sedはさらに広く利用可能であり、dos2unixがインストールされていなくてもこの種のことを行うことができます
C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt
また、trを試すこともできます。
cat hello.txt | tr -d \r > helloUNIX2.txt
結果は次のとおりです。
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.
viエディターで^ M文字を置き換えるには、以下を使用します
テキストファイルを開き、t1.txtと言います。
vi t1.txt
を押してコマンドモードに入ります shift + :
次に、前述のようにキーを押します %s/^M/\r/g
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
trを使用して、DOS / Windows(\ r \ n)の行末をUnix(\ n)の行末に変換します。
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
実行する別のviコマンド::%s/.$//
これにより、ファイルの各行の最後の文字が削除されます。この検索と置換コマンドの欠点は、最後の文字が何であるかを気にしないことです。そのため、2回呼び出さないように注意してください。