このサイトで提供されている回答を使用する際にいくつかの問題があります。この質問は、空行を他の2行に置き換えるsedコマンドに関するものです。この問題は、Mac OS(私の場合は10.6.7)でsedコマンドが異なる場合に発生します。私はそうは思いませんが、このサイトの他の人は違うと思いますか?
ベストアンサー1
OS Xは現在2005年のFreeBSD sedに同梱されています。以下の違いのほとんどは、他のBSD sedバージョンにも適用されます。
OS Xのsedは-E
ERE用で、GNU sedは-r
。-E
GNU sedのエイリアスです-r
(4.2に追加され、4.3までは文書化されていません)。最新バージョンのFreeBSDとNetBSDはsed-E
と-r
。 OpenBSD sedは-E
。
-i ''
OS Xのsedでは機能しますが、GNU sedでは機能しません。-i
GNU sed、最新バージョンのNetBSD、およびOpenBSDでは機能しますsed
が、OS Xのsedでは機能しません。-i -e
どちらも機能しますが、FreeBSDの場合は、sed
元のファイルのコピーがファイル名に追加されます-e
(そして1つ以上の式を渡す必要がありますsed
)。
\s
GNU sedは、、、、、、、など\t
のエスケープシーケンスを解釈します。OS XのsedおよびPOSIX sedについてのみ説明します(代替セクションでは説明しません)。\n
\001
\x01
\w
\b
\n
s
GNU sedはBREで\|
、およびを解釈します\+
が、\?
OS X sedおよびPOSIX sedはそうではありません。\(
、、、\)
および\{
は\}
POSIX BREです。
GNU sedは;
先行省略または改行を許可します}
が、OS Xのsedは許可しません。
i
OS XのsedとPOSIX sedでは、(挿入)、a
(追加)、およびc
(変更)の後にバックスラッシュと改行文字が続きますが、GNU sedではそうではありません。 GNU sedはi
、a
または挿入されたテキストの後に欠けている改行を追加しますc
が、OS Xのsedはそうではありません。たとえば、sed 1ia
GNUを置き換えますsed $'1i\\\na\n'
。
たとえば、printf a|sed -n p
OS Xのsedには改行文字が追加されますが、GNU sedでは追加されません。
I
OS X用のsedは、(大文字と小文字の区別)または(複数行)の修飾子をサポートしていませんM
。最新バージョンのFreeBSDはsedをサポートしていますI
。
-s
OS 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