BSD sed のワンライナーで小ハマりしたのでメモ
LinuxのGNU sedで期待通りに動いていた、全行読み込んでから改行を削除する定番イディオム
sed -e ':loop;N;$!b loop;s/\n//g'
が、なぜかMac OS XのBSD sedで期待どおりに動かなかった。
行の区切りにセミコロンを使わず、次のように複数個の -e で分割すると期待通りに動作した。
sed -e ':loop' -e 'N' -e '$!b loop' -e 's/\n//g'
試しに次のように分割してみると、 'loop;s/\n//g'
という未定義ラベルに分岐しようとしていると見做された。どうやらラベルの後ろのセミコロンはコマンドの区切りとして解釈されないらしい。
sed -e ':loop;N' -e '$!b loop;s/\n//g'
sed: 2: "$!b loop;s/\n//g
": undefined label 'loop;s/\n//g'
次のように書けば期待どおりに動作するので、ラベルの定義および参照の後のコマンド区切りセミコロンさえ避ければよいらしいことがわかった。
sed -e ':loop' -e 'N;$!b loop' -e 's/\n//g'
結論
tr使え