しらいです。

 Linux の台頭により、GNU の実装が de-facto standard となり
つつある今日この頃、古くからの UNIXer の方々にとっては暮らし
にくい時代になってきていたりはしないでしょうか。

In article <m3r7xh1hoe.fsf@kzin.dip.jp>, Mito  <co_mon@ybb.ne.jp> wrote:
>" で quote する場合、* も quote が必要なんで、

 また新しい shell 規格を実装した人が出てきましたか。


>        sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
>        sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i

 へ?「#include」への置換に成功したら「"」の置換は行なわな
いんですか?なんか命題と違うルールになっちゃってますけど。そ
れともまた新しい sed 規格でしょうか。
        $ echo "include 'xxx'"|sed "s/^include /#include /;t;s/'/\"/g"
        #include 'xxx'
        $ 
 因みに、GNU sed では上記の結果になりますが、*BSD な sed だ
と「ラベルが未定義」なエラーになります。「t」の後ろに「;」は
使えないんでしょうね。


>と同じように、{ でブロック化して、
>
>        sed "/^include /{s/^/#/;s/'/\"/g}" $i >tmp/$i

 「{」の後ろには何も function を置けなかったと思うのですが、
これが通用する sed はどの sed でしょう?少なくとも、*BSD と
GNU の実装では失敗します。
 以下のように「;」で改行してやると、GNU の実装では成功しま
すが *BSD の実装では先と同様失敗しますね。
        sed "/^include /{;s/^/#/;s/'/\"/g;}" $i >tmp/$i


>>  sed の実装により文法が微妙に異なるので、このうちどちらが有
>> 効かは環境依存ですが、場合によってはどちらも通らないかも知れ
>> ません。
>
>そうなんですか?
>
>そんなに色んな環境で sed をこねくりまわした経験はありません
>が、どちらもまっとうな使いかたのような気がしますが。

 -e が複数記述出来ない sed の実装があります。古い BSD がそ
うだったかな。
 また、「/regexp/func1;func2」が「{/regexp/func1};{func2}」
と解釈される実装と、「/regexp/{func1;func2}」と解釈される実
装とがあるようです。
 bug なのかも知れませんけど、man page で記述されていないよ
うな些末な点では、実装により仕様の揺れが幾つか観測されていま
す。


>環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
>知ってたら教えてください。

 以前、Ancient UNIX の source を片っ端から紐解いて比較した
ことがあるんですが、あれをもう一度やるのは大変なので、興味が
おありでしたらご自分で挑戦してみて下さい。
        http://www.tuhs.org/archive_sites.html

# 全部展開すると数 GB になるのでとっとと削除しちゃいました。
#全部 download して展開するだけでも一日仕事なので二度とやる
#気がしません :-)
# どっかで CVS 化して CVSweb か何かで公開してくれると便利
#なんですけどねー。

-- 
                                               しらい たかし