行末の「^ M」文字


99

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

何が原因で、どうすれば修正できますか?

回答:


79

DOS / Windowsの行末文字が原因です。Andy Whitfieldが言ったように、Unixコマンドdos2unixは問題の修正に役立ちます。詳細については、そのコマンドのマニュアルページを参照してください。


3
一部のシステム(つまりUbuntu)では、このコマンドの名前は "fromdos"です
bobwienholt

6
あなたがbrew install dos2unix自作をインストールしている場合、OSXでこのツールを非常に簡単に入手できます
フィリップ

73

vi次のコマンドを実行して、行末を修正します。

:set fileformat=unix

:w


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

3
これは^M、何らかの理由でsを削除しません。参照ファイル:/etc/timidity/fluidr3_gm.cfg
phil294 2017

39

原因は、WindowsベースのOSとUnixベースのOSが行末マーカーを格納する方法の違いです。

Windowsベースのオペレーティングシステムは、そのDOSの伝統のおかげで、行末を1組の文字0x0D0A(キャリッジリターン+ラインフィード)として保存します。Unixベースのオペレーティングシステムは0x0A改行)を使用します。表示され^Mているのは、0x0D復帰)を視覚的に表したものです。

dos2unixはこれに役立ちます。また、おそらくスクリプトのソースを「Unixフレンドリー」に調整する必要があります。


Windowsの現在のバージョンにDOSの遺産があるとは言えません。ただし、互換性にはまだ制限があります。
ジョーイ

これは簡単な方法で、自動変換ツールを使用します。ありがとう
Pjl

しかし、なぜ^Mですか?なぜ「^」なのか?なぜ「M」なのか?
1737973

「コントロールキャラクター」だからです。「^」は、コントロールキーをクリックしたときの視覚的な表現です。特定のバイトの下にある^は、エディターがそれらを表す方法です。
Hejazzman、2015

24

最も簡単な方法はを使用することviです。ひどい音に聞こえるかもしれませんが、簡単で、ほとんどのUNIX環境にすでにインストールされています。^ Mは、Windows / DOS環境からの新しいラインです。

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

次に、「:」を押してコマンドモードにします。

すべてをグローバルに検索して置換するには、:%s/^M//gコントロールを押し続けてからVを押してからMを押します」とすると、^ Mは何も置換されません。

次に、「:wq」と入力して終了します。


emacsで置き換える方法は?
herbertD 2013年

ありがとう!VI(M)は素晴らしいです!
IonicăBizău

3
^ M文字を入力する方法についての説明をありがとう!代わりに\ rに置き換えます。だから私は:%s / ^ M / \ r / g
aharris88を2014年


10

viで、 :%s/^M//g

取得するには^M保留CTRLキーを押して、Vその後、M(どちらもコントロールキーを押しながら)と^M表示されます。これにより、すべての出現箇所が検出され、何も置換されません。


2
UNIX優しい改行で^ Mを交換するには::%s/^M/\r/g
ゲイリーオーク

8

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

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

もちろん、perlを使用できますが、dos2unixよりもperlをお勧めしますか?
Thomas Owens、

2
4人が既にdos2unixを使用すると言っているので、私は代替案を提供しています。
リザードに請求する

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

7

^ Mは通常、Windowsオペレーターの改行が原因で発生し、Unixに変換すると^ Mのように見えます。コマンドdos2unixはそれらをうまく削除するはずです

dos2unix [オプション] [-c convmode] [-oファイル...] [-n infile出力ファイル...]


5
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.  

4

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)

あなたの最後の行は、以前のすべての答えから私が欠けていたものです。私はシフト+6を実行していたので、一致するものが見つかりませんでしたbc + shift + 6を実行していたため、すべてのハッカーがすることと、自分のソリューションで誤解を回避しました:$を実行して各行の終わりに移動し、xを押すだけで、マクロを記録しましたファイル内の行数分のマクロを繰り返します。
darethas

3

dos2unixコマンドの代わりに、などの標準ユーティリティを使用しますsed

たとえば、dos to unix:

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

unixからdos:

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

1

sedコマンドを使用して、ファイルから^ Mを直接削除できます。例:

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

変更に満足したら、.bakファイルを削除します。

rm -v *.bak


0

od -a $file Linuxでこれらのタイプの質問を調査するのに役立ちます(上記のdumphexと同様)。


0

Perlでは、$ /変数を設定したくない場合は、chomp()を使用することもできます。

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

私の2セント


-1

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


信頼できないことがわかっているのに、なぜそれを言及するのですか?
minexew 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.