UNIX環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の最後に '^ M'文字が表示されていますコマンドライン。 SQLスクリプトが最初に作成されたOSはわかりません。'^ M'文字列の終わり
これを引き起こしている原因は何ですか。どのように解決できますか?
UNIX環境で特定のSQLスクリプトを実行すると、SQLスクリプトの各行の最後に '^ M'文字が表示されていますコマンドライン。 SQLスクリプトが最初に作成されたOSはわかりません。'^ M'文字列の終わり
これを引き起こしている原因は何ですか。どのように解決できますか?
DOS/Windowsの行末文字が原因です。 Andy Whitfield氏によると、Unixコマンドdos2unixはこの問題を解決するのに役立つでしょう。さらに詳しい情報が必要な場合は、そのコマンドのマニュアルページを読むことができます。
dos2unixを使って^ Mを取り除いてみてください。
^Mは、通常、Windowsオペレータの改行によって引き起こされ、Unixに変換されたものは^ Mのように見えます。コマンドDOS2UNIXはそれらをきれいに
DOS2UNIXを削除する必要があります[オプション] [-c convmode] [-oファイル...] [-n infileをoutfileに...]
SQLスクリプトは、もともとWindows上で作成されましたOS。 '^ M'文字は、WindowsとUnixの結果で、行末の文字に何を使用するかについての考え方が異なります。コマンドラインでperlを使ってこれを修正することができます。 VIに
perl -pie 's/\r//g' filename.txt
確かに、perlを使うことができますが、dos2unixよりもperlをお勧めしますか? –
私はdos2unixを使用すると4人が話しているので、代わりの方法を提供しています。 –
はい、先史時代のIT部門のオフィスで働いている後方のワークステーションにいるので、これは便利です。 私はバリエーションを使用しました:perl -pi -e "s/\ x0D/\ n/g" file.csv – Rimian
は、^M
は(コントロールキーを押しながら両方)とVが、その後M^M
が表示されますCTRLキーを押しを保持して取得するには:%s/^M//g
を行います。これはすべての出現を見つけ出し、何も置き換えません。
^Mをunixフレンドリな改行で置き換えるには: '%s/^ M/\ r/g' –
原因は、WindowsベースのOSとUnixベースのOSが行末マーカーをどのように格納するかの違いです。
DOSベースのオペレーティングシステムのおかげで、Windowsのオペレーティングシステムは、文字のペアとして末尾の行を格納します - 0x0D0A
(改行+改行)。 Unixベースのオペレーティングシステムは、0x0A
(line feed)を使用します。表示されている^M
は、0x0D
(carriage return)の視覚的な表現です。
dos2unixがこれに役立ちます。おそらく、スクリプトのソースを「Unix-friendly」に調整する必要もあります。
最も簡単な方法はvi
です。
私は恐ろしいと聞きますが、
はシンプルで、ほとんどのUNIX環境にすでにインストールされています。^Mは、Windows/DOS環境からの新しい行です。
コマンドプロンプトから:$ vi filename
次に、コマンドモードに取得するには、 ":
" を押してください。
検索し、すべてのグローバルな置き換えは、「その後、Vを押して押しとコントロールを保持、その後 M」:%s/^M//g
で何も^ Mに置き換えられます。
書き込みして終了するには「:wq
」と入力してください。
もう1つのviコマンド::%s/.$//
これは、ファイル内の各行の最後の文字を削除します。この検索および置換コマンドの欠点は、最後の文字が何であるか気にしないので、2回呼び出さないように注意してください。
信頼できないと分かっているのなら、なぜそれを言いますか? – minexew
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.
od -a $file
は、Linuxでこれらのタイプの質問を調べるのに便利です(上記のdumphexに似ています)。実行してvi
で
修正行末以下:
:set fileformat=unix
Perlで
:w
これはすばらしい答えです。どうもありがとう。 (dos2unixをインストールして保存しました。おそらく一度だけ使用するツールです) – Jamsi
+1。とてもきれいです。 –
完全に動作します。 –
、あなたは$ /変数と使用ムシャムシャ食べるを設定したくない場合は()することができますまた、実行します。
$var =~ /\r\n//g;
私の2セント
は^
以下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)
あなたの最後の行は、私が以前のすべての回答から欠けていたものです。私はマッチは見つからなかった。私はshift + 6を行っていたので、私は自分の解答で私の誤解を回避した。だから マクロを記録して各行の最後に移動し、ファイル内の行数numに対してマクロを繰り返すだけです。 – darethas
dos2unix
コマンドの代わりに、次のような標準ユーティリティを使用しますe sed
。例えば
、UNIXへ ドス:ドスへ
sed 's/\r$//' dos.txt > unix.txt
UNIX:
sed 's/$/\r/' unix.txt > dos.txt
あなたは、sedコマンドを経由して直接ファイルから^ Mを削除することができます。例:
sed -i'.bak' s/\r//g *.*
変更に満足している場合は、を削除してください。BAKファイル:
rm -v *.bak
変換DOS/Windowsの(\ Rの\ n)がTRとのUnix(\ n)が行末に改行コード、:一部のシステムでは
tr '\r\n' '\n' <dosFile.txt> unixFile.txt
(すなわちUbuntu)このコマンドの名前は "fromdos" – bobwienholt
あなたは自作ソフトをインストールしたときに 'brew install dos2unix'を使ってOSX上でツールを簡単に手に入れることができます – philipp