shirai@unixusers.net (Takashi SHIRAI) writes:

>  先生方にも筆の誤り?
> 
> >>   mkdir tmp
> >>   for i in *.F
> >>   do
> >>     sed 's/include \'\(.*\)\'/#include "\1"/' $i >tmp/$i
> >>   done
> 
>  普通の shell だと「'」を含むような文字列は "" で quote し
> た方が記述し易いと思います。

" で quote する場合、* も quote が必要なんで、

>    sed "s/include '\(.*\)'/#include \"\1\"/" $i >tmp/$i
        sed "s/include '\(.\*\)'/#include \"\1\"/" $i >tmp/$i

でしょうか。

私は、

        sed "s/include '\([^']+\)'/#include "'"\1"' $i >tmp/$i

あたりがおすすめかな。

>  それだと「'」→「"」の変換が出来ませんから、s function を
> もう一つ書かなくては。
>    sed "/^include /s/^/#/;s/'/\"/g" $i >tmp/$i

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

のどっちでも同じだと思いますが、/^include /と一致しなかった
場合は t で最後まで吹っ飛ばす必要がありますよね。

もしくは、

> or
>    sed -e "/^include /{" -e "s/^/#/" -e "s/'/\"/g" -e "}" $i >tmp/$i

と同じように、{ でブロック化して、

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

とか。

>  sed の実装により文法が微妙に異なるので、このうちどちらが有
> 効かは環境依存ですが、場合によってはどちらも通らないかも知れ
> ません。

そうなんですか?

そんなに色んな環境で sed をこねくりまわした経験はありません
が、どちらもまっとうな使いかたのような気がしますが。

上の例で ; をコマンドの区切りに使うというのはちょっとイレギュ
ラーだから拡張された sed だとだめかも知れませんが、sed って
知らないコマンドがきたら改行と同じように区切り文字だと思って
くれるってのは昔っからの仕様だったような気がしますので、大抵
はうまくいくと思います。

-e は一行で記述するときに改行みたいな役割をするための昔っか
らあるオプションだからこちらも問題ないかと。

ブロック化の { も昔っからあると思いますし。

環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
知ってたら教えてください。
-- 
01/31 02:14頃
水戸