2009-04-28 14 views
161

キャリッジリターン\rをUnixのファイルからすべて削除する最も簡単な方法は?Unixのキャリッジリターンを削除する

+1

「\ r」「\ n」、または厄介な「\ r」のいずれかについて話していますか? –

+0

関連:[^ M(Windowsキャリッジリターン)を含むファイルを見つけるためのgrep](http://superuser.com/q/194668/86416)。 –

答えて

204

私はあなたがキャリッジリターンをで(CR"\r"は、0x0d)(あなたはすべての私のための文字列の途中でそれらを持っていることはなく、ただやみくもにファイル内の以下の行のを終了を意味すると仮定するつもりです知っている)。それはあなたのシステムにインストールされていた場合に行くことに

$ cat infile 
hello 
goodbye 

$ cat infile | od -c 
0000000 h e l l o \r \n g o o d b y e \n 
0000017 

dos2unix方法をされています:最初の行のみの終わりにCRと、このテストファイルを使用して

$ cat infile | dos2unix -U | od -c 
0000000 h e l l o \n g o o d b y e \n 
0000016 

何らかの理由dos2unix用その後、sedはそれを行うだろう、あなたには使用できません。

$ cat infile | sed 's/\r$//' | od -c 
0000000 h e l l o \n g o o d b y e \n 
0000016 

場合は何らかの理由でsedはあなたに利用できない場合、edは複雑な方法で、それを行います。

$ echo ',s/\r\n/\n/ 
> w !cat 
> Q' | ed infile 2>/dev/null | od -c 
0000000 h e l l o \n g o o d b y e \n 
0000016 

を、あなたのボックスにインストールされているこれらのツールの任意のを持っていない場合は、しようとするよりも大きな問題を持っています参照してください

+11

'\ r'はGNU sedとしか動作しません。そうでなければ' sed \ 'echo" s/\ r // "\' ' – lapo

+14

MacOSでは' sed'と 'echo'は '\ r'を認識しません。この場合、 'printf" \ r "のみが動作するように見えます。 –

+0

マッチ式に一致する文字列の一部ではない\ nが含まれているので、 'sed'の例は期待どおりに動作しませんか? 言い換えれば、それは 'sed 's/\ r $ //''ではないでしょうか? – mklement0

25

多くのシステムに存在するユーティリティーdos2unixがあり、ほとんどの場合、簡単にインストールできます。

+6

時にはfromdos(およびtodos)とも呼ばれます。 – Anonymous

7

sed -i s/\r// <filename>またはsomesuch; man sedまたはsedの使用に関してウェブ上で利用可能な豊富な情報を参照のこと。

上記で「キャリッジリターン」の正確な意味を指摘しておきます。あなたが本当に単一の制御文字 "復帰"を意味するなら、上記のパターンは正しいです。より一般的には、CRLF(復帰改行と、改行がWindowsでどのように実行されるか)を意味する場合は、代わりに\r\nを置き換えてください。 Linux/Unixのベアラインフィード(改行)は\nです。

+0

私は、動作しない - > sedの/ \ r \ n/=/'countryNew.txt> demo.txtを使用しようとしています。 \t \t \t \t "虎" \t \t "ライオン" – Suvasis

+0

あなたはそれがあなたがマックにいることを意味すると思いますか?私はダーウィンsedは、デフォルトでは、ほとんどのLinuxのバージョンよりも異なるコマンドと機能セットを持っているようです... – jsh

+3

FYI、 's/\ r //'はOS X上のキャリッジリターンを削除していないようです代わりにリテラル 'r'文字を削除してください。なぜそれがまだあるのか分かりません。たぶんそれは文字列の引用方法と関係がありますか?この問題を回避するには、 '\ r'の代わりに' CTRL-V + CTRL-M'を使用することが有効です。 –

184
tr -d '\r' <infile> outfile 

:-)ファイルを変換するtr(1)

+1

非常に簡単で信頼できる。ありがとうございました。 –

+3

Not great:1.インプレースでは動作しません。2. EOLではなく\ rも置き換えることができます(あなたが望むかもしれないかもしれません...)。 –

+4

1.ほとんどのunixyツールはそのように動作します。あなたがいなくても元のものを持っていれば、物事を知る最も安全な方法です。 2.記載されている問題は、行末を変換しないで、改行を取り除くことです。 しかし、他にもあなたに役立つ回答がたくさんあります。 –

27

オールドスクール:

tr -d '\r' <filewithcarriagereturns> filewithoutcarriagereturns 
+1

これは魅力的に働いた:)ありがとう。 – user1336087

+0

目的地と同じファイルを使用しないでください... – Hejazzman

1

ドスは、UNIXのファイルに変換するために、これを試してみてください。

fromdosはviユーザーである場合は、ファイルを開くとしてキャリッジリターンを削除することがあり

5

ファイル:

:%s/\r//g 

かと

:1,$ s/^M// 

ctrl-vを押してからCtrl + mを押すと^ Mと入力する必要があることに注意してください。

+2

ファイルがすべての行にCR(つまり正しいDOSファイル)がある場合、vimはfiletype = dosでロードし、 '^ Mさんはまったくありません。これを回避することは、キーストロークの大部分です。これは、ヴィムが作られるものではありません。私は 'sed -i'と' -e 's/\ r $ // gのためだけにEOLのCRへの削除を制限します。 –

1

あなたがdos2unixコマンドを持っていますが、Pythonインタプリタ(バージョン2.5+)を持っていないん(OS Xのような)OSを使用している場合、このコマンドはdos2unixのコマンドと同じです。

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))" 

これは、dos2unixのように、コマンドライン上の名前付きファイルとパイプとリダイレクトの両方を処理します。あなたは〜/ .bashrcファイル(またはその他のシェルと同等のプロファイルファイル)に次の行を追加する場合:

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\"" 

...ログインする(または現在のセッションでsource ~/.bashrcを実行します)次回になります他の例と同じ方法でコマンドラインでdos2unixという名前を使用することができます。

0

は、単にこれを行うことができます:他に

$ echo $(cat input) > output 
+0

誰かがなぜ「-1」を与えたのか分かりません。これは完全に良い答えです(私のために働いた唯一のもの)。 – FractalSpace

+0

ああ、申し訳ありません、それは私でした。 待って、見て、それは本当に '\ r'のために動作しません! –

+1

@FractalSpaceこれはひどい考えです!ファイル内のすべてのスペースを完全に破壊し、ファイルのすべての内容をシェルが解釈できるようにします。 1行の 'a * b'を含むファイルで試してみてください... –

3

誰かがdos2unixをお勧めしますし、私は強く同様にそれをお勧めします。私は詳細を提供しています。

インストールされている場合は、次の手順に進みます。まだインストールされていない場合、私は同じようyumを経由して、それをインストールすることをお勧めします:

yum install dos2unix 

次に、あなたが好きそれを使用することができます:ここでは

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt 
2

は事ある、

%0dは、キャリッジリターン文字です。それをUnixとの互換性を持たせる。以下のコマンドを使用する必要があります。もう一度ソリューション

dos2unix fileName.extension fileName.extension

6

...もう一つは常にありますので:

perl -i -pe 's/\r//' filename 

それは場所でだと私が一緒に働いてきたUNIX/Linuxでのすべての味で動作しますので、それはうれしいです。

0

私はPythonを使っています。私のコードはここにあります。

end1='/home/.../file1.txt' 
end2='/home/.../file2.txt' 
with open(end1, "rb") as inf: 
    with open(end2, "w") as fixed: 
     for line in inf: 
      line = line.replace("\n", "") 
      line = line.replace("\r", "") 
      fixed.write(line) 
11

Linux上で最も簡単な方法は、私見

sed -i 's/\r//g' <filename> 

置換演算子's/\r//'周り強い引用符不可欠ありますさ。それらがなければ、シェルは\rをエスケープ+ rと解釈し、それを平文rに縮小し、小文字のrをすべて削除します。そのため、上記の2009年の回答はRobで動作しません。

/g修飾子を追加すると、最初のものだけでなく、複数の\rも削除されます。

1

UNIXの場合... dos2unixがUnicodeヘッダーを削除して、UTF-8ファイルが作成されていることに気付きました。 git bash(Windows)の下では、以下のスクリプトはうまく動作するようです。それはsedを使用します。これは、行末のキャリッジリターンのみを削除し、Unicodeヘッダーを保持することに注意してください。

#!/bin/bash 

inOutFile="$1" 
backupFile="${inOutFile}~" 
mv --verbose "$inOutFile" "$backupFile" 
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile" 
1

あなたはX環境を実行し、適切なエディタ(Visual Studioのコードを)持っている場合は、私はreccomendationをたどる:

Visual Studio Code: How to show line endings

ちょうどあなたの右下隅に行きますスクリーン、ビジュアルスタジオコードは、ファイルエンコーディングとファイルの後ろに続く行のコンベンションの両方を表示します。単純なクリックだけで、それを切り替えることができます。

Linux環境では、notepad ++の代わりにビジュアルコードを使用するだけで、移動するように設定されています。

関連する問題