ラッパと正しいエスケープ

再生産した理由として、さっきリンクしたサイトのものは wfind が無かった、ということと、エスケープがきちんとされてなかった、ということがあります。 * なんかで検索したい場合、

grep '*' *

などとするわけですが、 wgrep は内部で grep $@ などとして呼んでいるため、 wgrep '*' * とすると、 grep * file1 file2... となってしまって、これは意図した結果では無いわけです。

対策としては、各引数をきちんとシングルクォートで囲ってやる、というものがあって、まぁそれを長らく使ってたわけです。が、これにも一つ問題があって、引数にシングルクォートが含まれる場合にあらあらまあまあとなってしまう、と。で、結局どうするか、っていうと

grep 'It'\''s good' *

となるようにしてやればいいわけで、そういうロジックを入れて、ついでに似たようなことしたい機会は結構あるので、ライブラリとして切り出した…というのが再生産を再生産した理由、と。

Ruby でこういうエスケープをしたい場合、

ARGV.map{|a|"'#{a.gsub("'",%q('\\\\''))}'"}*' '

とかでいいんだと思う。これもなかなかにややこしくて良いです。特に gsub の第二引数の \' は特別な意味があってややこしいとか。

こういうエスケープがどうこうのネチっこい話は、以下の akr さんの記述が非常に面白かったです。

https://www.codeblog.org/blog/akr/?year=2007;category=escape

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h