-------------------------------------
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