Re: ディレクトリ内ファイル一括置換
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頃
水戸
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