作者: Bunta
日時: 2005/4/25(23:31)
 Bruce.さん、お手数をおかけしてしまって、m(__)m

`0a' does not work (gives an error)
     There is no line 0.  0 is a special address that is only used to
     treat addresses like `0,/RE/' as active when the script starts: if
     you write `1,/abc/d' and the first line includes the word `abc',
     then that match would be ignored because address ranges must span
     at least two lines (barring the end of the file); but what you
     probably wanted is to delete every line up to the first one
     including `abc', and this is obtained with `0,/abc/d'.

(訳)
 0番目の行など存在しないことに注意。アドレスの0は特別で、アドレス部が
"0,/RE/" のような場合に、これを適切なものとして扱うために装備されている。"
1,/abc/d"  となっていて、最初の行が "abc" を含む場合には、このマッチング
は無視される。理由は、アドレス・レンジは2行以上に渡っていなければいけな
いからだ(最終行は例外)。とはいえ、おそらく "1,/abc/d" と書いたのなら、
それはたとえ  "abc" が一行目にあっても、ファイル先頭からそこまでを削除し
て欲しかったのだろう。こんなときに "0,/abc/d" が使えるわけだ。


 うん、 レンジは2行に渡らなければならない。  また、 レンジは inclusive
(sedfaq の表現)なので、片方のアドレスはその行を含んでしまう。 堂々巡り
だけど、だから、レンジは2行以上でなければならない。よって、1行目を処理
するために、0 アドレスが必要になる。

>type test.txt
1
2
3
4
5

>mbsed "1,3d" test.txt
>onigsed "1,3d" test.txt
>mbsed "0,/1/d" test.txt
>onigsed "0,/1/d" test.txt
>mbsed "5,/5/d" test.txt	(最終行が例外であること)
>mbsed "5,$d" test.txt		(最終行が例外であること)
 上記、OKでした。

 確かに仰るとおり、0からのレンジ指定は正規表現とペアでなければいけない
ようですね。というか、意味がない。でも、GNU sed 4.0.7 と、ssed 3.59 は、"
0,1d", "0,2d" みたいのを通すんですよね。こっちがバグなんでしょう。
 "1d", "1,2d" でそれぞれいいわけだし。最初のアドレスが 0 でなければ、"1,
123d" とか後ろを行数でも指定できるわけだし。うん、そうだ。だから、0,/RE/
のみ通す、このアドレッシングに意味がありうる、ということでした。

 お手数をおかけしました。勉強になりました。m(__)m

 追伸:別ソースでも調査いただいてようで、ほんとうにすいませんでした。あ
りがとうございました。m(_B_)m