101

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

これを引き起こしているのは何ですか?どうすれば修正できますか?

4

17 に答える 17

80

これは、DOS/Windows の改行文字が原因です。Andy Whitfield が言ったように、Unix コマンド dos2unix が問題の解決に役立ちます。詳細が必要な場合は、そのコマンドのマニュアル ページを参照してください。

于 2008-09-15T17:07:05.553 に答える
77

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

:set fileformat=unix

:w

于 2008-09-16T15:52:50.107 に答える
40

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

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

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

于 2008-09-15T17:11:29.690 に答える
24

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

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

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

すべてをグローバルに検索して置換するのは、:%s/^M//g" Control を押したまま V を押してから M を押す" で、^M は何も置換しません。

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

于 2008-09-15T17:32:10.703 に答える
13

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

于 2008-09-15T17:06:14.167 に答える
10

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

キーを押し続けるには、次に(コントロール キーを押しながら両方) を押すと、が表示され^Mます。これにより、すべての出現箇所が検索され、何も置き換えられません。CTRLVM^M

于 2008-09-15T17:10:38.693 に答える
8

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

perl -pie 's/\r//g' filename.txt
于 2008-09-15T17:10:14.873 に答える
7

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

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

于 2008-09-15T17:08:38.590 に答える
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.  
于 2008-09-15T18:31:41.650 に答える
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)
于 2013-04-17T14:34:08.397 に答える
1

tr を使用して、DOS/Windows (\r\n) の行末を Unix (\n) の行末に変換します。

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

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

于 2014-06-03T20:10:19.297 に答える
0

Perl では、$/ 変数を設定せずに chomp() を使用する場合は、次のようにすることもできます。

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

私の2セント

于 2013-03-07T04:32:19.757 に答える
0

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

于 2008-09-15T19:54:22.450 に答える
0

すでに説明したように、Windows プログラムは、行をCRLFで終了することを好みます。つまり\r\n、Unix/Linux 標準の代わりに終了します\n。のすべての機能が必要なわけではないのでdos2unix、次を my に追加して置き換えました。これにより、~/.bashrcが削除されます\r

function win2unix() {
    tmp=$(mktemp) && tr -d '\r' < $1 > $tmp && mv $tmp $1
}

^MExcel や Calc から CSV ファイルをエクスポートするときなど、作成された文字を削除したい場合は、次のようにします。

win2unix filename.csv

sedもちろん、または他のものを使用することもできます。ちなみに、私は結末cat -e $filenameを視覚化するために使用します。^M

于 2022-01-21T17:04:20.877 に答える
-1

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

于 2008-09-15T18:24:40.357 に答える