shirai@unixusers.net (Takashi SHIRAI) writes:

> >" で quote する場合、* も quote が必要なんで、
> 
>  また新しい shell 規格を実装した人が出てきましたか。

Fujishima さんにも指摘されてしまいましたが、なんかすっかり勘
違いしてしまったようで。^^;

> >        sed "/^include /s/^/#/;t;s/'/\"/g" $i >tmp/$i
> >        sed "s/^include /#include /;t;s/'/\"/g" $i >tmp/$i
> 
>  へ?「#include」への置換に成功したら「"」の置換は行なわな
> いんですか?なんか命題と違うルールになっちゃってますけど。そ
> れともまた新しい sed 規格でしょうか。

あれ?こっちも勘違いしちゃいましたかね?

「#include」への置換に成功したら「'」を「"」に変換して、失敗
したら変換しないってつもりなんですけど...

>    $ echo "include 'xxx'"|sed "s/^include /#include /;t;s/'/\"/g"
>    #include 'xxx'
>    $ 
>  因みに、GNU sed では上記の結果になりますが、*BSD な sed だ
> と「ラベルが未定義」なエラーになります。「t」の後ろに「;」は
> 使えないんでしょうね。

あらま、ほんとだ。

そういやtの後は改行か -e 以外ではどうやってもだめだったよう
な気がしてきました。

ご指摘ありがとうございます。

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

う〜ん、ぼろぼろですねぇ。
やっぱりちゃんと実行して確認しないとだめですね...と思ったら

  $ echo "include 'XXX'"|sed "/^include /{s/^/#/;s/'/\"/g}"
  #include "XXX"

あれ、できちゃいました。^^;

  $ sed --version
  GNU sed version 4.0.5
  Copyright (C) 2002 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
  to the extent permitted by law.

FreeBSD のほうはやっぱりだめでした。

  $ ident /usr/bin/sed
  /usr/bin/sed:
     $FreeBSD: src/usr.bin/sed/compile.c,v 1.13.2.3 2001/11/29 05:22:44 mikeh Exp $
     $FreeBSD: src/usr.bin/sed/main.c,v 1.9.2.4 2001/11/29 05:22:44 mikeh Exp $
     $FreeBSD: src/usr.bin/sed/misc.c,v 1.3.2.1 2001/11/29 05:22:44 mikeh Exp $
     $FreeBSD: src/usr.bin/sed/process.c,v 1.10.2.1 2001/11/29 05:22:44 mikeh Exp $

sed では最後 } が「s/'/\"/g」の g と同様に s のフラグと勘違
いされるらしく、

  $ echo "include 'XXX'"|sed "/^include /{s/^/#/;s/'/\"/g}"
  sed: 1: "/^include /{s/^/#/;s/'/ ...": bad flag in substitute command: '}'

となりましたが、最後を「/g;}"」にすると動きました。

「{ の後に...」ってのは関係ないみたいですね。

>  -e が複数記述出来ない sed の実装があります。古い BSD がそ
> うだったかな。

ほんとですか! -e って改行の代わりに存在するようなオプション
だと思っていたのですが、そんなのがあったんですか。なんのため
のオプションだったのでしょうかね?

>  また、「/regexp/func1;func2」が「{/regexp/func1};{func2}」
> と解釈される実装と、「/regexp/{func1;func2}」と解釈される実
> 装とがあるようです。

>  bug なのかも知れませんけど、man page で記述されていないよ
> うな些末な点では、実装により仕様の揺れが幾つか観測されていま
> す。

へぇ〜へぇ〜へぇ〜...(over 90へぇ)。前者しか知りませんでした。

> >環境依存でだめな場合の sed ってどんなものがあるんでしょうう?
> >知ってたら教えてください。
> 
>  以前、Ancient UNIX の source を片っ端から紐解いて比較した
> ことがあるんですが、あれをもう一度やるのは大変なので、興味が
> おありでしたらご自分で挑戦してみて下さい。
>    http://www.tuhs.org/archive_sites.html

いえ、そこまでするつもりはありません。
どうもありがとうございました。
-- 
01/31 22:48頃
水戸