web-dev-qa-db-ja.com

Unixでキャリッジリターンを削除

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

199
Aldur

私はあなたがキャリッジリターンを意味すると仮定するつもりです(CR"\r"0x0d)をファイルの中だけで盲目的にではなく、終わりにします(私が知っていることはすべて文字列の途中に置いてもいいです)。このテストファイルを CR 最初の行の終わりにのみ:

$ 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はあなたのシステムにインストールされている場合に行く方法です:

$ 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

あなたが持っていないのであればanyこれらのツールがあなたのボックスにインストールされている、あなたはファイルを変換しようとするよりも大きな問題を抱えている:-)

241
paxdiablo
tr -d '\r' < infile > outfile

tr(1) を参照してください。

214

古い学校:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
36
plinth

dos2unix というユーティリティがたくさんのシステムにあり、ほとんどのシステムに簡単にインストールできます。

27
Emil H

Linuxでの最も簡単な方法は、私の謙虚な意見では、

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

置換演算子's/\r//'を囲む強力な引用符必須です。これらがなければ、シェルは\rをエスケープ+ rとして解釈し、それを普通のrに減らし、すべての小文字のrを削除します。だからこそ、2009年に Rob によって与えられた答えがうまくいかないのです。

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

23
wfjm

sed -i s/\r// <filename>またはsomesuch; man sedまたはsedの使用に関するWeb上の豊富な情報を参照してください。

指摘しておくべきことの1つは、上記の「キャリッジリターン」の正確な意味です。あなたが本当に1つの制御文字 "キャリッジリターン"を意味するのであれば、上記のパターンは正しいです。もっと一般的には、CRLF(キャリッジリターンとラインフィード、つまりWindowsでラインフィードが実装される方法)を意図しているのであれば、代わりに\r\nを置き換えます。 Linux/Unixの裸の改行(newline)は\nです。

7
Rob

あなたがViユーザーであれば、ファイルを開いてキャリッジリターンを削除することができます。

:%s/\r//g

またはと

:1,$ s/^M//

Ctrl-vを押してからctrl-mを押して、^ Mと入力する必要があります。

6
Alex Giotis

もう1つ解決策は…

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

それはきちんと整っていて、私が一緒に働いたことがあるunix/linuxのあらゆるフレーバーで動くので、それはいいです。

6
Allan Cano

他の誰かがdos2unixを推薦します、そして私もそれを強く推薦します。私はもっ​​と詳細を提供しています。

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

yum install dos2unix

それからあなたはそれを使うことができます:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
3
James Oravec

これが事です、

%0dはキャリッジリターン文字です。 Unixと互換性を持たせるため。下記のコマンドを使用する必要があります。

dos2unix fileName.extension fileName.extension

2

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

#!/bin/bash

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

あなたがX環境を実行していて、適切なエディタ(ビジュアルスタジオコード)を持っているなら、私はお勧めに従います:

Visual Studioコード:行末の表示方法

画面の右下隅に移動するだけで、ビジュアルスタジオのコードでファイルのエンコーディングと行末の規則の両方が表示されます。クリックするだけでそれを切り替えることができます。

Linux環境では、メモ帳++の代わりにビジュアルコードを使用するだけです。

1
99Sono

dosファイルをunixファイルに変換するためにこれを試してください:

fromdosファイル

1
hawston

dos2unixコマンドを持っていないがPythonインタプリタ(バージョン2.5+)を持っているOS(OS Xのような)を使っているなら、このコマンドは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という名前を使用できます。

1
Chris Johnson

私はそれのために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)
0
Raphael

古い記事ですが、最近私は同じ問題に遭遇しました。/tmp/blah_dir /の中にすべてのファイルの名前を変更する必要があるので、このディレクトリの各ファイルには末尾に "/ r"が付いていたので(ファイルの最後に "?"が表示されます).

私は最終的なファイルを同じ名前で保存したいと思いました(文字を末尾に付けずに)。 sedでは、問題は出力ファイル名であり、それを他のものに言及するのに必要でした(私はそれを望んでいませんでした)。

私はここで提案されているように他のオプションを試しました(いくつかの制限のためdos2unixとは見なされません)が、うまくいきませんでした。

私は最後に "awk"を試しましたが、 "\ r"を区切り文字として使っていたところでうまくいきました

トリックです:

echo ${filename}|awk -F"\r" '{print $1}'

私の問題を解決するために私が使ったスクリプトスニペット(パス/ tmp/blah_dir /の末尾の文字としてすべてのファイルに "\ r"がある)の下に:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

注:この例は私が働いたことに近いけれどもそれほど正確ではありません(私がしたことについてもっと良い考えを与えるためにここで言及すること)

0

UNIX®システムで\rを削除する:

この質問のほとんどの既存のソリューションはGNU固有であり、OS XまたはBSDでは機能しません。以下のソリューションは、tcshからshまでの多くのUNIXシステムおよびシェルで動作するはずですが、GNU/Linuxでも動作します。

OS X、OpenBSD、およびNetBSDで tcsh で、Debian GNU/Linuxで bash でテストされています。


sedの場合:

OS Xのtcshでは、次の sed スニペットを printf と一緒に使用できます。これは、sedecho も特別な方法で\rを処理しないためです。 GNUのように:

sed `printf 's/\r$//g'` input > output

trの場合:

別のオプションは tr

tr -d '\r' < input > output

sedtrの違い:

trは入力ファイルの末尾の改行の欠如を保持しているように見えますが、OS XおよびNetBSD(ただしOpenBSDまたはGNU/Linuxではない)のsedは、入力が最後であってもファイルの最後に末尾の改行を挿入しますファイルの最後に末尾の\rまたは\nがありません。


テスト:

以下は、printfおよび hexdump -C ;を使用して、システムでこれが機能することを確認するために使用できるサンプルテストです。あるいは、システムにhexdumpがない場合は、 od -c も使用できます。

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 
0
cnst