web-dev-qa-db-ja.com

`^ M`とは何ですか。どうすれば削除できますか?

Vimでファイルを開くと、奇妙な^M文字が表示されます。

残念ながら、世界で人気の検索エンジンはクエリの特殊文字ではうまく機能しないため、ここで質問します。

  • この^M文字は何ですか?

  • どうしてそこに到達できたのでしょうか?

  • どうすれば取り除くことができますか?

166
Christoph Wurm

^Mは復帰文字です。これが表示された場合、おそらくDOS/Windowsの世界で発生したファイルを見ており、行末には改行と改行のペアが付いていますが、Unixの世界では単一の改行でマークされています。

詳細については この記事 を読んでください newline のWikipediaエントリもご覧ください。

この記事 は、行末マーカーが異なるファイルを透過的に編集するようにvimを設定する方法について説明しています。

いくつかの行の終わりに^Mを含むファイルがあり、それらを削除したい場合は、Vimでこれを使用します。

:s/^M$//

(押す Ctrl+VCtrl+M その^Mを挿入します。)

125
larsks

これを行う簡単な方法は、次のコマンドを使用することです。

dos2unix filename

このコマンドはパスパターンでも機能します。

dos2unix path/name*

動作しない場合は、別のモードを使用してみてください。

dos2unix -c mac filename
  • -c変換モードを設定します。 CONVMODEは次のいずれかです。ascii, 7bit, iso, macasciiがデフォルトです。
49
AnonGeek

ほとんどのUNIXオペレーティングシステムには、CRLFをLFに変換するdos2unixというユーティリティがあります。他の回答は「彼らは何ですか」という質問をカバーしています。

41
Aaron Brown

これは私のために働いた

:e ++ff=dos 

:e ++ ff = dosコマンドは、ファイルを再度読み取るようにVimに指示し、dosファイル形式を強制します。VimはCRLFおよびLFのみの行末を削除し、バッファー内の各行のテキストのみを残します。 =

その後

:set ff=unix 

そして最後に

:wq 
32
Stryker

改行を取り除く別の方法は、trコマンドを使用することです。

このような小さなスクリプトがあります

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
11
Johan

これはsedでクリーンアップできます:

sed -e 's/^M$//' < infile > outfile

トリックは、キャリッジリターンを適切に入力する方法です。通常、文字どおりの改行を入力するには、C-v C-mと入力する必要があります。また、sed作業を行うこともできます。

sed -i.bak -e 's/^M$//' infile
7
Dale Hagglund

これは^ Mとは何ですか?
^ Mは復帰文字です。これが表示された場合、おそらくDOS/Windowsの世界で発生したファイルを見ており、行末には改行と改行のペアが付いていますが、Unixの世界では単一の改行でマークされています。

どうやってそこに到達できたのでしょうか?
ファイル形式に変更があった場合。

どうすれば削除できますか?
ファイルを開く

vim -b FILE_PATH

次のコマンドで保存します

:%s/^M//g
4
Prashant Kanse

私の場合、

上記は機能しませんでした。CSVファイルをMacからLinuxマシンにコピーし、上記のすべてのコマンドを使用しましたが、以下の1つしか役に立ちませんでした

tr "\015" "\n" < inputfile > outputfile

^ M文字が次のような行の間に挟まれたファイルがありました

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
3

VimはExモードで使用できます。

ex -bsc '%s/\r//|x' file
  1. -bバイナリモード

  2. %すべての行を選択

  3. s代替

  4. \r キャリッジリターン

  5. x保存して閉じる

1
Steven Penny

特殊文字を入力する必要のないSedインプレースソリューション(これをコピーすると機能します):

sed -i -e "s/\r//g" filename

説明:

-i: in-place
-e: regular expression
\r: escaped carriage return
/g: replace globally
0
DreamFlasher

ここでのオプションはどれも私にとってはうまくいきませんでした。

最後にファイルをMS Wordで開き、^ Mが消えました。切り取り、選択した他のエディターに貼り付けます。

0
user219042

過去に、設定ファイルでさえ正しく解析されず空白について文句を言うのを見てきましたが、viを実行してリストを設定すると空白が表示されず、grep filename [[space]]で^ Mが表示されます

dos2unix fileが役立ちます

0
Sriram

次の行を〜/ .vimrcに追加します

command! Tounix :call Preserve('1,$s/^M//')

次に、Windowsの行末を持つファイルがある場合、コマンド ":Tounix"を実行します。

0
Charlie Dalsass