2017-11-27 31 views
3

WindowsからUNIXへの通常の変換では、sed s/\r//gのように、ストリームから¥r文字を削除することができます。sedの/ r n/ r/gが期待通りに動作しないのはなぜですか?

しかし、私はマックエンコード(\ r)またはウィンドウエンコード(\ r \ n)できるファイルのエンドラインを変換しようとしています。だから私は\ rを削除することはできません、それがある場合は、Macのエンディングを削除します。私は最初に行末の文字を "正規化"しなければなりません。この正規化ステップは\ r \ nから\ rに変換します(その後、\ rから\ nへの変換を行います)。しかし、私はsedでこのステップを解決することはできません。

$> echo -e "foo\r\nbar" | bbe -e 's/\r\n/\r/g' | xxd -c 24 -g 1 
00000000: 66 6f 6f 0d 62 61 72 0a    foo.bar. 

は、SEDと同じことを行うすることが可能です:私はこのようなBBEとそれを解決することができました

$> echo -e "foo\r\nbar" | sed 's/\r\n/\r/g' | xxd -c 24 -g 1 
00000000: 66 6f 6f 0d 0a 62 61 72 0a   foo..bar. 

:私はこのような何かを試してみましたか?

答えて

3

sedデフォルトでは、入力は\nに分割されているため、\nはパターンスペースで決して終了しません。あなたはへのすべての行を追加することができ、で、また

$ echo -e "foo\r\nbar" | sed -z 's/\r\n/\r/g' | hd 
00000000 66 6f 6f 0d 62 61 72 0a       |foo.bar.| 

POSIX sedを:あなたはGNU sedを使用している場合は、あなたはsedNUL文字区切り線などの入力を処理するために-z/--null-dataオプションを使用することができますパターン(ループ内N command付き)スペース、効果的にパターンスペースに完全なファイルをコピーして、代替の操作を行います。

$ echo -e "foo\r\nbar" | sed -n ':a;N;ta; s/\r\n/\r/g; p' | hd 
00000000 66 6f 6f 0d 62 61 72 0a       |foo.bar.| 
2

perlは、sed/awkとは異なりレコードセパレータを削除しません。このソリューションは、\nがレコード

ごとに一度だけ発生する可能性がありますよう g修飾子が必要とされていない

$ echo -e 'foo\r\nbar' | perl -pe 's/\r\n/\r/' | xxd -c 24 -g 1 
00000000: 66 6f 6f 0d 62 61 72 0a    foo.bar. 

注ことを丸呑みされるファイル全体を必要としません

関連する問題