行末を保持


111

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

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


2
以下のソリューションはmacOSでは機能しません。
William Entriken 2017年

私はここまでLC_ALL=C perl -i -e 'binmode $STDIN;undef $/;$_=<>;s|http://911coned.com|https://911coned.com|gm;print' education.html
たどり着きました

したがって、実際には上記のコマンドは機能し、git diffプログラムのバグを発見しました。
William Entriken

1
sed(特別なオプションなし)+ unix2dos
mems

回答:


143

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

例: sed -b 's/foo/bar/'

行末を一致させる場合は、オプションのキャリッジリターンを必ず一致させ、キャプチャしてコピーしてください。

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

sedのmanページ

-b-バイナリ

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


5
これはsed -icygwin(私にとって)では機能しませんが、回避できます。更新をありがとう-他の答えはしばらくの間この主題の最後の言葉でした。
harpo

このオプションはMacのsedでは使用できません。
Senthil Kumaran

21
でも動作しsed -iます:それを入力する方法が重要です。一方でsed -bised -i -b仕事、sed -ibていない(使用理由のmanページを参照してください。作業bバックアップ・コピーのための接尾辞として)。
オラフマンデル

2
使用:sed -bi 's/foo/bar/'
Kunal B.

2
Windows cygwinでは動作しません。sedが変更を加えた行では、行末はUnixyです。残りの行には、ウィンドウっぽい行末があります。したがって、私のファイルには異なる行末の行が混在しています。
TruthAdjuster 2017年

10

次のように、既存のスクリプトの最後に\nfor をsubすることを試みることができ\r\nます:

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

多分

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

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

別の方法としては、使用することがあるcygwinのバージョンsedいるべきではありません。この望ましくない動作を持っています。


15
cygwinバージョンには、この望ましくない動作があります。
harpo

2
ファイルに\ n(0x0A)と\ r \ n(0x0D 0x0A)の両方が含まれている場合-この提案されたソリューション(常に\ rを再注入する)はそれを壊します。
Vlad

これは、MSYS2 / MinGWを使用している場合に機能します。@SiegeXありがとうございます。
AntumDeluge

6

あるいは、(のcygwinバージョン)perl -peにはこの問題がないようです。


MacOSのsedには-bオプションがなく、元の質問で説明されているのと同様の問題があります。perlの代替にはこの問題がないので、提案をありがとう。 sed -i -e 's/<img[^>]*\/>//g' *.xml行末を「\ n」で置換し perl -i -p -e 's/<img[^>]*\/>//g' *.xmlて元の行末を保持
Guruniverse

2

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

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


1
私の答えで作業-iモードのバージョンを参照してください。
Vadzim 2017

2

私はhttps://github.com/mbuilov/sed-windowssed-4.4.exeからそれとして純粋な勝利であることを発見しました

  • デフォルトモードでWindows CRLF行末を使用
  • -bモードで元の行末を保持
  • インプレース-iモードで正しく動作します
  • また、提供しています-zとモードを\0区切り文字の代わりに、\nその時々便利なことがありすぎて

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

gnuwin32 sed 4.2.1は、モードの行末を破壊し-biモードをまったく持たないことに注意してください-z

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.