作者: Bunta
日時: 2008/9/03(21:52)
-------------------------------------
C:\>echo zz| ssed -R "G; s/.$/N/"	(1) Perl mode
zN


C:\>echo zz| ssed "G; s/.$/N/"		(2) BRE
zzN

C:\>echo zz| mbsed "G; s/.$/N/"		(3) BRE
zzN

C:\>echo zz| onigsed -R "G; s/.$/N/"	(4) Perl mode
zz


C:\>echo zz| onigsed "G; s/.$/N/"	(5) BRE
zN


-------------------------------------

 (1)-(3)が正しい振る舞いであると思われ、(4)(5)はかなりおかしいはずです。
 オプションスイッチがらみあると思われますし、$の解釈も、でしょうか。


 簡単に解説を試みてみます(僕の理解)。

 まず藤岡さんが悩まれたように(今日、 合点がいきました)、Perl の正規表
現では、「.」は「\n」にマッチしません(Ruby も同じ。つまり鬼車も同じ。)
BRE GNU sed ではマッチします。上で、コマンド入力行の下に結果が出ていますが、
そのあとの空行の数にも注意してください。「\n」がどう扱われたかを示している
からです。

 sed スクリプトは、「zz\n」というパターンスペース文字列に対して、終端の
1文字を「N」に置換せよ、という意味です。 終端1文字はモードによって意味
が変わります。

(1) Perlでは「.」は「\n」にマッチなしでしたから、zが終端文字。よって「zN\n」。
(2)(3) BRE(sed @ GNU)では(藤岡さんが驚かれたように)、「\n」にマッチします
 から、「zzN」。ここまではよいでしょう。

 (4)は(1)と同じになるべき。		???
 (5)は(2)(3)と同じになるべき。しかし(1)と同じ結果。	???


 何か間違っていたら、ご指摘ください。 > all


 追伸:各コマンド行の間の空行は、cmd.exe の仕様でしょう(command.com 時
代から変わっていない)。 空行が2つのとき、1つは sed が出したパターンス
ペースの中身と考えてください(A)。zzN  のような文字列末尾の「\n」は sed
がデフォルトで出すもの (B) と考えてください。(A)(B) が逆という解釈でもい
いですけれど。


 私信> Bruce. さん。次々と今頃、本当に申し訳ありません。ただ、何度も繰
り返し申し上げざるを得ないのですが、 mbsed には Perl mode がありません。
もちろんお時間がとれたときで構いませんので、bug fix をお願いいたします。
m(_B_)m


Bunta