作者: 藤岡和夫
日時: 2008/8/17(22:01)
On Sun, 17 Aug 2008 20:38:46 +0900
Bunta <hi9t-ooy@...-net.or.jp> さんwrote:

> >C:\Scripts>bin\onigsed -R -f test.sed object
> >v.c./vz 43番, 文太
> >のように、-nオプションを除くとコマンドラインに出力されました。
> 
>  これは、あの、あの、あの。藤岡さん、sedを完全に忘れてしまいましたね。
>  sedは、awkやperlと違って、入力をデフォで出力するんです。意識的に-nを
> しないと。で、あのスクリプトはグレップなんです。

 なるほど、もう忘れていますね(^^;)sedはFGALTS以来触っていないですからね。sed
の機能はjperlですべて実現できますし、jperlは速いですから。

>  ですから(繰り返しですが)、-nを取って入力行が出てきても、マッチしたか
> どうかは分からないのです(もちろん、僕もマッチするはずじゃん、と思ってい
> るんですが。たぶん、Onigsedのほうに問題があると思う。もちろん、僕の頭に
> 問題がある可能性は、いつでもいっぱいあるのですが。)
> 
> --- object ---
> v.c./vz 43番
> aaaa			#-nを取ったら、この行もマッチもしないのに
> --------------		#出力されてきます。
> 
> --- test.sed ---
> #Onigsed -n -R -f test.sed
> /v\.c\.\/vz [0-9]+/p
> ----------------
> 
>  「aaaa」はどうでもよいのですが、申し訳ありませんが、これをもう一度だけ
> やってみていただけませんか。「-R」は外しても意味が変わりません(ただその
> スクリプトでは必要なんです)実際、これを外しても、やっぱりマッチしてくれ
> ないと思うのです。
> /v\.c\.\/vz [0-9]+/
>  のどこで不具合が発生しているのか、どうもうまく判定できないのですが。

 最初から一文字ずつ加えていって、どこでマッチしなくなるか調べると、半角
空白のところでマッチしなくなります。半角空白を\sに交換するとマッチするよ
うになります。この場合は-Rオプションが必要ですね。

 半角空白以降の「[0-9]+番」もマッチしますから、半角空白のマッチの部分が
おかしいですね。他の例を作って試しましたけど、再現しました。

-----^ data.txt
v.c./vz 43番, 文太
aaaa
12345
a 1
-----$

-----^ a.sed
/[a-z] [0-9]/p
-----$

-----^ b.sed
/[a-z]\s[0-9]/p
-----$

a.sedはdata.txtのどの行にもマッチしませんが、b.sedは、

C:\Scripts>bin\onigsed -n -R -f b.sed < data.txt
v.c./vz 43番, 文太
a 1

とマッチします。

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html