Mac OSXのsedと他の「標準」sedの違いは何ですか?

Mac OSXのsedと他の「標準」sedの違いは何ですか?

このサイトで提供されている回答を使用する際にいくつかの問題があります。この質問は、空行を他の2行に置き換えるsedコマンドに関するものです。この問題は、Mac OS(私の場合は10.6.7)でsedコマンドが異なる場合に発生します。私はそうは思いませんが、このサイトの他の人は違うと思いますか?

ベストアンサー1

OS Xは現在2005年のFreeBSD sedに同梱されています。以下の違いのほとんどは、他のBSD sedバージョンにも適用されます。

OS Xのsedは-EERE用で、GNU sedは-r-EGNU sedのエイリアスです-r(4.2に追加され、4.3までは文書化されていません)。最新バージョンのFreeBSDとNetBSDはsed-E-r。 OpenBSD sedは-E

-i ''OS Xのsedでは機能しますが、GNU sedでは機能しません。-iGNU sed、最新バージョンのNetBSD、およびOpenBSDでは機能しますsedが、OS Xのsedでは機能しません。-i -eどちらも機能しますが、FreeBSDの場合は、sed元のファイルのコピーがファイル名に追加されます-e(そして1つ以上の式を渡す必要がありますsed)。

\sGNU sedは、、、、、、、など\tのエスケープシーケンスを解釈します。OS XのsedおよびPOSIX sedについてのみ説明します(代替セクションでは説明しません)。\n\001\x01\w\b\ns

GNU sedはBREで\|、およびを解釈します\+が、\?OS X sedおよびPOSIX sedはそうではありません。\(、、、\)および\{\}POSIX BREです。

GNU sedは;先行省略または改行を許可します}が、OS Xのsedは許可しません。

iOS XのsedとPOSIX sedでは、(挿入)、a(追加)、およびc(変更)の後にバックスラッシュと改行文字が続きますが、GNU sedではそうではありません。 GNU sedはiaまたは挿入されたテキストの後に欠けている改行を追加しますcが、OS Xのsedはそうではありません。たとえば、sed 1iaGNUを置き換えますsed $'1i\\\na\n'

たとえば、printf a|sed -n pOS Xのsedには改行文字が追加されますが、GNU sedでは追加されません。

IOS X用のsedは、(大文字と小文字の区別)または(複数行)の修飾子をサポートしていませんM。最新バージョンのFreeBSDはsedをサポートしていますI

-sOS Xのsedは(--separate)、-u--unbuffered)、-z()をサポートしていません--null-data

GNU sedがサポートしていないBSDオプションの1つは、ファイルを切り捨てるのではなくファイルに追加する-aことです。w

OS X sedで動作しないGNU sedコマンドの例:

sed /pattern/,+2d # like `sed '/pattern/{N;N;d;}'`
sed -n 0~3p # like `awk NR%3==0`
sed /pattern/Q # like `awk '/pattern/{exit}1'` or `sed -n '/pattern/,$!p'`
sed 's/\b./\u&/g' # \u converts the next character to uppercase
sed 's/^./\l&/' # \l converts the next character to lowercase
sed -i '1ecat file_to_prepend' file # e executes a shell command
sed -n l0 # 0 disables wrapping

おすすめ記事