Unixでファイルからすべてのキャリッジリターン\r
を削除する最も簡単な方法は何ですか?
私はあなたがキャリッジリターンを意味すると仮定するつもりです(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これらのツールがあなたのボックスにインストールされている、あなたはファイルを変換しようとするよりも大きな問題を抱えている:-)
tr -d '\r' < infile > outfile
tr(1) を参照してください。
古い学校:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
dos2unix というユーティリティがたくさんのシステムにあり、ほとんどのシステムに簡単にインストールできます。
Linuxでの最も簡単な方法は、私の謙虚な意見では、
sed -i 's/\r$//g' <filename>
置換演算子's/\r//'
を囲む強力な引用符は必須です。これらがなければ、シェルは\r
をエスケープ+ rとして解釈し、それを普通のr
に減らし、すべての小文字のr
を削除します。だからこそ、2009年に Rob によって与えられた答えがうまくいかないのです。
/g
修飾子を追加することで、最初のものだけでなく、複数の\r
さえも確実に削除されます。
sed -i s/\r// <filename>
またはsomesuch; man sed
またはsed
の使用に関するWeb上の豊富な情報を参照してください。
指摘しておくべきことの1つは、上記の「キャリッジリターン」の正確な意味です。あなたが本当に1つの制御文字 "キャリッジリターン"を意味するのであれば、上記のパターンは正しいです。もっと一般的には、CRLF(キャリッジリターンとラインフィード、つまりWindowsでラインフィードが実装される方法)を意図しているのであれば、代わりに\r\n
を置き換えます。 Linux/Unixの裸の改行(newline)は\n
です。
あなたがViユーザーであれば、ファイルを開いてキャリッジリターンを削除することができます。
:%s/\r//g
またはと
:1,$ s/^M//
Ctrl-vを押してからctrl-mを押して、^ Mと入力する必要があります。
もう1つ解決策は…
Perl -i -pe 's/\r//' filename
それはきちんと整っていて、私が一緒に働いたことがあるunix/linuxのあらゆるフレーバーで動くので、それはいいです。
他の誰かがdos2unix
を推薦します、そして私もそれを強く推薦します。私はもっと詳細を提供しています。
インストールされている場合は、次の手順に進みます。まだインストールされていない場合は、yum
経由でインストールすることをお勧めします。
yum install dos2unix
それからあなたはそれを使うことができます:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
これが事です、
%0d
はキャリッジリターン文字です。 Unixと互換性を持たせるため。下記のコマンドを使用する必要があります。
dos2unix fileName.extension fileName.extension
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"
あなたがX環境を実行していて、適切なエディタ(ビジュアルスタジオコード)を持っているなら、私はお勧めに従います:
画面の右下隅に移動するだけで、ビジュアルスタジオのコードでファイルのエンコーディングと行末の規則の両方が表示されます。クリックするだけでそれを切り替えることができます。
Linux環境では、メモ帳++の代わりにビジュアルコードを使用するだけです。
dosファイルをunixファイルに変換するためにこれを試してください:
fromdosファイル
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
という名前を使用できます。
私はそれのために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)
古い記事ですが、最近私は同じ問題に遭遇しました。/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
注:この例は私が働いたことに近いけれどもそれほど正確ではありません(私がしたことについてもっと良い考えを与えるためにここで言及すること)
\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
と一緒に使用できます。これは、sed
も echo
も特別な方法で\r
を処理しないためです。 GNUのように:
sed `printf 's/\r$//g'` input > output
tr
の場合:別のオプションは tr
:
tr -d '\r' < input > output
sed
とtr
の違い: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
%