2008-09-15 13 views
87

UNIX環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の最後に '^ M'文字が表示されていますコマンドライン。 SQLスクリプトが最初に作成されたOSはわかりません。'^ M'文字列の終わり

これを引き起こしている原因は何ですか。どのように解決できますか?

答えて

68

DOS/Windowsの行末文字が原因です。 Andy Whitfield氏によると、Unixコマンドdos2unixはこの問題を解決するのに役立つでしょう。さらに詳しい情報が必要な場合は、そのコマンドのマニュアルページを読むことができます。

+3

(すなわちUbuntu)このコマンドの名前は "fromdos" – bobwienholt

+6

あなたは自作ソフトをインストールしたときに 'brew install dos2unix'を使ってOSX上でツールを簡単に手に入れることができます – philipp

13

dos2unixを使って^ Mを取り除いてみてください。

7

^Mは、通常、Windowsオペレータの改行によって引き起こされ、Unixに変換されたものは^ Mのように見えます。コマンドDOS2UNIXはそれらをきれいに

DOS2UNIXを削除する必要があります[オプション] [-c convmode] [-oファイル...] [-n infileをoutfileに...]

8

SQLスクリプトは、もともとWindows上で作成されましたOS。 '^ M'文字は、WindowsとUnixの結果で、行末の文字に何を使用するかについての考え方が異なります。コマンドラインでperlを使ってこれを修正することができます。 VIに

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

確かに、perlを使うことができますが、dos2unixよりもperlをお勧めしますか? –

+2

私はdos2unixを使用すると4人が話しているので、代わりの方法を提供しています。 –

+2

はい、先史時代のIT部門のオフィスで働いている後方のワークステーションにいるので、これは便利です。 私はバリエーションを使用しました:perl -pi -e "s/\ x0D/\ n/g" file.csv – Rimian

9

は、^Mは(コントロールキーを押しながら両方)とVが、その後M^Mが表示されますCTRLキーを押しを保持して取得するには:%s/^M//g

を行います。これはすべての出現を見つけ出し、何も置き換えません。

+2

^Mをunixフレンドリな改行で置き換えるには: '%s/^ M/\ r/g' –

39

原因は、WindowsベースのOSとUnixベースのOSが行末マーカーをどのように格納するかの違いです。

DOSベースのオペレーティングシステムのおかげで、Windowsのオペレーティングシステムは、文字のペアとして末尾の行を格納します - 0x0D0A(改行+改行)。 Unixベースのオペレーティングシステムは、0x0Aline feed)を使用します。表示されている^Mは、0x0Dcarriage return)の視覚的な表現です。

dos2unixがこれに役立ちます。おそらく、スクリプトのソースを「Unix-friendly」に調整する必要もあります。

+0

現在のバージョンのWindowsにはDOS *の遺産があるとは言いません。彼らはまだ互換性の制約があります。 – Joey

+0

これは簡単な方法ですが、自動変換ツールを使用していますか?ありがとうございました – peter

+0

なぜ '^ M'ですか?なぜ '^'ですか?なぜ 'M'? – uprego

24

最も簡単な方法はviです。 私は恐ろしいと聞きますが、 はシンプルで、ほとんどのUNIX環境にすでにインストールされています。^Mは、Windows/DOS環境からの新しい行です。

コマンドプロンプトから:$ vi filename

次に、コマンドモードに取得するには、 ":" を押してください。

検索し、すべてのグローバルな置き換えは、「その後、Vを押して押しとコントロールを保持、その後 M:%s/^M//gで何も^ Mに置き換えられます。

書き込みして終了するには「:wq」と入力してください。

+0

emacsでどのように置き換えるのですか? – herbertD

+0

ありがとう! VI(M)は素晴らしいです! –

+2

^M文字の入力方法を説明してくれてありがとう!代わりに\ rで置き換えます。だから私はしました:%s/^ M/\ r/g – aharris88

-1

もう1つのviコマンド::%s/.$//これは、ファイル内の各行の最後の文字を削除します。この検索および置換コマンドの欠点は、最後の文字が何であるか気にしないので、2回呼び出さないように注意してください。

+0

信頼できないと分かっているのなら、なぜそれを言いますか? – minexew

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

セッドがさらに広く利用可能であると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. 
0

od -a $fileは、Linuxでこれらのタイプの質問を調べるのに便利です(上記のdumphexに似ています)。実行してvi

68

修正行末以下:

:set fileformat=unix Perlで

:w

+2

これはすばらしい答えです。どうもありがとう。 (dos2unixをインストールして保存しました。おそらく一度だけ使用するツールです) – Jamsi

+1

+1。とてもきれいです。 –

+0

完全に動作します。 –

0

、あなたは$ /変数と使用ムシャムシャ食べるを設定したくない場合は()することができますまた、実行します。

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

私の2セント

4

は^

以下viエディタの使用中のMの文字がテキストファイルを開く交換するには

%s/^M/\r/gを述べたように、その後のキーを押し shift + :

を押してコマンドモードに入ります

vi t1.txt 

t1.txt言います

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

あなたの最後の行は、私が以前のすべての回答から欠けていたものです。私はマッチは見つからなかった。私はshift + 6を行っていたので、私は自分の解答で私の誤解を回避した。だから マクロを記録して各行の最後に移動し、ファイル内の行数numに対してマクロを繰り返すだけです。 – darethas

3

dos2unixコマンドの代わりに、次のような標準ユーティリティを使用しますe sed。例えば

、UNIXへ ドス:ドスへ

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

UNIX:

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

あなたは、sedコマンドを経由して直接ファイルから^ Mを削除することができます。例:

sed -i'.bak' s/\r//g *.* 

変更に満足している場合は、を削除してください。BAKファイル:

rm -v *.bak 
関連する問題