作者: Bunta
日時: 2008/8/28(11:39)
 あのスクリプトと結果報告だけでは、と思っておりました。
 問題の箇所を詰める方法を考えついたので、結果を報告させていただきます。

 Onigsedでは、s/\n\n/\n/の命令に対して、s/\n\n/\n\n/のように
振る舞ってしまうのです。


===== test.sed =====
# デリミタ"---"の前が改行でないなら改行挿入
$!N
/^[^\n][^\n]*\n---$/{
        s/\n/\
\
/
        P
        s/[^\n]*\n//
                }
P
D
====================

===== test.txt =====
aaa
---
====================

>sed -f test.sed test.txt >kek  で実験。結果は、

===== test.txt =====#GNU sed version 4.0.7(意図通り)
aaa

---
====================

===== test.txt =====#Onigsed(残念)
aaa
---
====================


 問題箇所は、pythonスクリプトのsedデバッガ
(see http://sedsed.sourceforge.net/)で見つけました。
以下がその模様です。#は僕のコメントです。


GNU sed (ver. 4.0.7)

PATT:aaa$
COMM:$ !N
PATT:aaa\n---$
COMM:/^[^\n][^\n]*\n---$/ {
COMM:s/\n/\\N\\N/
PATT:aaa\n\n---$
COMM:P
aaa
PATT:aaa\n\n---$                #「\n」は2つ
COMM:s/[^\n]*\n//               #「\n」を1つ消す
PATT:\n---$                     #「\n」が1つ残っている(意図通り)
COMM:}
COMM:P

PATT:\n---$
COMM:D
PATT:---$
COMM:$ !N
PATT:---$
COMM:/^[^\n][^\n]*\n---$/ {
COMM:P
---
PATT:---$
COMM:D

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

Onigsed

PATT:aaa$
COMM:$ !N
PATT:aaa\n---$
COMM:/^[^\n][^\n]*\n---$/ {
COMM:s/\n/\\N\\N/
PATT:aaa\n\n---$
COMM:P
aaa
PATT:aaa\n\n---$                #「\n」は2つ
COMM:s/[^\n]*\n//               #「\n」を1つ消す
PATT:---$                       #1つ残るはずの「\n」が消えている。
COMM:}
COMM:P
---
PATT:---$
COMM:D


--------------------------------------------
 因みに、(昨日、うまくいかない日本語版としてあげたもう一つの)
GNU sed version 3.02 + multi-byte extension 1.07
 では、
Stack overflow!
 と泣きます、泣かされます。

Bunta