web-dev-qa-db-ja.com

行末の「^ M」文字

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

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

97
Paul Reiners

DOS/Windowsの行末文字が原因です。 Andy Whitfieldが言ったように、Unixコマンドdos2unixは問題の修正に役立ちます。さらに情報が必要な場合は、そのコマンドのマニュアルページを読むことができます。

77
Thomas Owens

以下を実行して、viの行末を修正します。

:set fileformat=unix

:w

74
Tim Abell

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

Windowsベースのオペレーティングシステムは、DOSの伝統のおかげで、行末を文字のペアとして保存します-0x0D0A(キャリッジリターン+ラインフィード)。 Unixベースのオペレーティングシステムでは、0x0A(a 改行 )。 ^M表示されているのは、0x0D(a キャリッジリターン )。

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

39
ColinYounger

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

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

次に、「: "コマンドモードに切り替えます。

[すべてをグローバルに検索および置換]は:%s/^M//g "コントロールを押したままVを押してからMを押す"これは^ Mを何も置き換えません。

次に、書き込みと終了を行うには、「:wq "完了!

24
Bernie Perez

Dos2unixを使用して^ Mを削除してみてください。

13
Andy Whitfield

Viで、:%s/^M//gを実行します

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

9
dogbane

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

Perl -pie 's/\r//g' filename.txt
8
Bill the Lizard

^ Mは通常、Windows演算子の改行によって発生し、Unixに変換されると^ Mのように見えます。コマンドdos2unixはそれらをうまく削除するはずです

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

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

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)
4

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

たとえば、unixへのdos:

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

uNIXからdosへ:

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

DOS/Windows(\ r\n)行末をUnix(\ n)行末に変換します。tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

nixコマンドラインからの改行の置換に関する投稿

1
Mason Wright

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

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

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

rm -v *.bak
1
kenorb

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

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

私の2セント

0
Ariel Monaco

od -a $fileは、Linuxでこれらのタイプの質問を調べるのに役立ちます(上記のdumphexに似ています)。

0
Allan Wind