web-dev-qa-db-ja.com

行末を保持

Windowsでsedを実行して置換を実行すると、行末が自動的にUnix(\ n)に変換されることに気付きました。 Windowsの行末記号(\ r\n)を使用するようにsedに指示するオプションがありますか、それともファイルから行末記号を保持することをお勧めしますか?

注:unxutilsのsedを使用します: http://unxutils.sourceforge.net/

103
Bogdan Calmac

Sedで_-b_オプションを使用して、ファイルをバイナリとして扱うことができます。これにより、Windows上のcygwinのsedの問題が修正されます。

例:_sed -b 's/foo/bar/'_

行末を一致させたい場合は、オプションのキャリッジリターンを一致させ、キャプチャしてコピーすることを忘れないでください。

例:sed -b 's/foo\(\r\?\)$/bar\1/'

sed manページ から:

-b --binary

このオプションはすべてのプラットフォームで使用できますが、オペレーティングシステムがテキストファイルとバイナリファイルを区別する場合にのみ有効です。 MS-DOS、Windows、Cygwinの場合のように、このような区別が行われると、テキストファイルはキャリッジリターンとラインフィード文字で区切られた行で構成され、sedは終了CRを認識しません。このオプションを指定すると、sedは入力ファイルをバイナリモードで開くため、この特別な処理を要求せず、行が改行で終了することを考慮しません。

132
Shlomo

\n にとって \r\n次のような既存のスクリプトの最後に:

sed 's/foo/bar/;s/$/\r/'

多分

 sed -e 's/foo/bar/' -e 's/$/\r/'

上記の2つのどちらでも機能しない場合は、sedのバージョンの特定のマニュアルページを参照して、そのようなオプションが存在するかどうかを確認する必要があります。 sedの* nixバージョンはnotを実行するように指示されることなく行末記号を変更することに注意してください。

別の代替方法は、cygwinsedバージョンを使用することです。このバージョンではshould n'tが望ましくない動作をします。

10
SiegeX

または、(cygwinバージョンの)Perl -peはこの問題を抱えていないようです。

6
seeker

-bスイッチとリダイレクトのみを指定した場合、Gnuwinを抑制して改行を混乱させる(win-> unix)ことができます。 -i(インライン)スイッチを使用すると、混乱します。

例えば。 sed.exe -b "s/\ xFF\xFE //" c:\ temp\in.csv> c:\ temp\out.csv

2
buckley

https://github.com/mbuilov/sed-windows からのsed-4.4.exeが純粋な勝利であることがわかりました

  • デフォルトモードでWindows CRLF行末を使用します
  • -bモードで元の行末を保持します
  • インプレースの-iモードで正しく動作します
  • また、-zの代わりに\0デリミタを使用した\nモードも提供します。これは が便利な場合があります

sedオプションのリスト および すべてのウィンドウsedポートのリスト も参照してください。

gnuwin32 sed 4.2.1 は、-biモードで corrupt line endings を行い、-zモードをまったく持たないことに注意してください。

1
Vadzim