Unix環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の末尾に「^ M」文字が表示され、コマンドラインにエコーされます。 SQLスクリプトが最初に作成されたOSがわかりません。
これは何が原因で、どうすれば修正できますか?
DOS/Windowsの行末文字が原因です。 Andy Whitfieldが言ったように、Unixコマンドdos2unixは問題の修正に役立ちます。さらに情報が必要な場合は、そのコマンドのマニュアルページを読むことができます。
以下を実行して、vi
の行末を修正します。
:set fileformat=unix
:w
最も簡単な方法は、vi
を使用することです。 私はそれがひどいように聞こえますが、 シンプルで、ほとんどのUNIX環境にすでにインストールされています。 ^ Mは、Windows/DOS環境からの新しい行です。
コマンドプロンプトから:$ vi filename
次に、「:
"コマンドモードに切り替えます。
[すべてをグローバルに検索および置換]は:%s/^M//g
"コントロールを押したままVを押してからMを押す"これは^ Mを何も置き換えません。
次に、書き込みと終了を行うには、「:wq
"完了!
Dos2unixを使用して^ Mを削除してみてください。
Viで、:%s/^M//g
を実行します
^M
を取得するには、 CTRL キー、押す V それから M (コントロールキーを押している間)と^M
が表示されます。これにより、すべての出現箇所が検索され、何も置き換えられません。
SQLスクリプトはもともとWindows OS上で作成されました。 '^ M'文字は、WindowsとUnixが行末文字に何を使用するかについて異なるアイデアを持っている結果です。これを修正するには、コマンドラインでPerlを使用します。
Perl -pie 's/\r//g' filename.txt
^ Mは通常、Windows演算子の改行によって発生し、Unixに変換されると^ Mのように見えます。コマンドdos2unixはそれらをうまく削除するはずです
dos2unix [オプション] [-c convmode] [-oファイル...] [-n infile outfile ...]
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)
dos2unix
コマンドの代わりに、sed
などの標準ユーティリティを使用します。
たとえば、unixへのdos:
sed 's/\r$//' dos.txt > unix.txt
uNIXからdosへ:
sed 's/$/\r/' unix.txt > dos.txt
DOS/Windows(\ r\n)行末をUnix(\ n)行末に変換します。tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
Sedコマンドを使用して、ファイルから^ Mを直接削除できます。例:
sed -i'.bak' s/\r//g *.*
変更に満足したら、.bakファイルを削除します。
rm -v *.bak
Perlでは、$ /変数を設定せずにchomp()を使用したくない場合は、次のこともできます。
$var =~ /\r\n//g;
私の2セント
od -a $file
は、Linuxでこれらのタイプの質問を調べるのに役立ちます(上記のdumphexに似ています)。