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