Windowsでsedを実行して置換を実行すると、行末が自動的にUnix(\ n)に変換されることに気付きました。 Windowsの行末記号(\ r\n)を使用するようにsedに指示するオプションがありますか、それともファイルから行末記号を保持することをお勧めしますか?
注:unxutilsのsedを使用します: http://unxutils.sourceforge.net/
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は入力ファイルをバイナリモードで開くため、この特別な処理を要求せず、行が改行で終了することを考慮しません。
\n
にとって \r\n
次のような既存のスクリプトの最後に:
sed 's/foo/bar/;s/$/\r/'
多分
sed -e 's/foo/bar/' -e 's/$/\r/'
上記の2つのどちらでも機能しない場合は、sed
のバージョンの特定のマニュアルページを参照して、そのようなオプションが存在するかどうかを確認する必要があります。 sed
の* nixバージョンはnotを実行するように指示されることなく行末記号を変更することに注意してください。
別の代替方法は、cygwin
のsed
バージョンを使用することです。このバージョンではshould n'tが望ましくない動作をします。
または、(cygwinバージョンの)Perl -pe
はこの問題を抱えていないようです。
-bスイッチとリダイレクトのみを指定した場合、Gnuwinを抑制して改行を混乱させる(win-> unix)ことができます。 -i(インライン)スイッチを使用すると、混乱します。
例えば。 sed.exe -b "s/\ xFF\xFE //" c:\ temp\in.csv> c:\ temp\out.csv
https://github.com/mbuilov/sed-windows からのsed-4.4.exe
が純粋な勝利であることがわかりました
-b
モードで元の行末を保持します-i
モードで正しく動作します-z
の代わりに\0
デリミタを使用した\n
モードも提供します。これは が便利な場合がありますsedオプションのリスト および すべてのウィンドウsedポートのリスト も参照してください。
gnuwin32 sed 4.2.1 は、-bi
モードで corrupt line endings を行い、-z
モードをまったく持たないことに注意してください。