あのスクリプトと結果報告だけでは、と思っておりました。
問題の箇所を詰める方法を考えついたので、結果を報告させていただきます。
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