Re: ディレクトリ内ファイル一括置換
しらいです。
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 か何かで公開してくれると便利
#なんですけどねー。
--
しらい たかし
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735