Unix環境で特定のSQLスクリプトを実行すると、コマンドラインにエコーされるため、SQLスクリプトの各行の最後に「^M」文字が表示されます。SQLスクリプトが最初に作成されたOSがわかりません。
これを引き起こしているのは何ですか?どうすれば修正できますか?
Unix環境で特定のSQLスクリプトを実行すると、コマンドラインにエコーされるため、SQLスクリプトの各行の最後に「^M」文字が表示されます。SQLスクリプトが最初に作成されたOSがわかりません。
これを引き起こしているのは何ですか?どうすれば修正できますか?
これは、DOS/Windows の改行文字が原因です。Andy Whitfield が言ったように、Unix コマンド dos2unix が問題の解決に役立ちます。詳細が必要な場合は、そのコマンドのマニュアル ページを参照してください。
vi
次のコマンドを実行して、行末を修正します。
:set fileformat=unix
:w
原因は、Windows ベースの OS と Unix ベースの OS の行末マーカーの保存方法の違いです。
Windows ベースのオペレーティング システムは、DOS の遺産のおかげで、行末を文字のペア0x0D0A
(キャリッジ リターン + ライン フィード) として保存します。Unix ベースのオペレーティング システムでは0x0A
、(ライン フィード) のみを使用します。表示されているのは(キャリッジ リターン^M
)を視覚的に表現したものです。0x0D
dos2unixがこれに役立ちます。おそらく、スクリプトのソースを「Unix フレンドリー」に調整する必要もあります。
最も簡単な方法は、 を使用することvi
です。ひどい話に聞こえるかもしれませんが、シンプルで、ほとんどの UNIX 環境に既にインストールされています。^M は、Windows/DOS 環境の改行です。
コマンドプロンプトから:$ vi filename
次に、「 」を押し:
てコマンド モードにします。
すべてをグローバルに検索して置換するのは、:%s/^M//g
" Control を押したまま V を押してから M を押す" で、^M は何も置換しません。
次に、「:wq
」と入力して終了します
dos2unixを使用して^Mを取り除いてみてください。
vi で、:%s/^M//g
キーを押し続けるには、次に(コントロール キーを押しながら両方) を押すと、が表示され^M
ます。これにより、すべての出現箇所が検索され、何も置き換えられません。CTRLVM^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)
tr を使用して、DOS/Windows (\r\n) の行末を Unix (\n) の行末に変換します。
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
Perl では、$/ 変数を設定せずに chomp() を使用する場合は、次のようにすることもできます。
$var =~ /\r\n//g;
私の2セント
od -a $file
Linux でこれらのタイプの質問を調べるのに役立ちます (上記の dumphex に似ています)。
すでに説明したように、Windows プログラムは、行をCRLFで終了することを好みます。つまり\r\n
、Unix/Linux 標準の代わりに終了します\n
。のすべての機能が必要なわけではないのでdos2unix
、次を my に追加して置き換えました。これにより、~/.bashrc
が削除されます\r
。
function win2unix() {
tmp=$(mktemp) && tr -d '\r' < $1 > $tmp && mv $tmp $1
}
^M
Excel や Calc から CSV ファイルをエクスポートするときなど、作成された文字を削除したい場合は、次のようにします。
win2unix filename.csv
sed
もちろん、または他のものを使用することもできます。ちなみに、私は結末cat -e $filename
を視覚化するために使用します。^M
実行する別の vi コマンド::%s/.$//
これは、ファイル内の各行の最後の文字を削除します。この検索と置換コマンドの欠点は、最後の文字が何であるかを気にしないことです。そのため、2 回呼び出さないように注意してください。