2015年4月28日火曜日

mgとgreple

メール本文などのJISコードで保存されている日本語ファイルから文字列を検索するためにmgというプログラムを使っていました。
mg-5.0.1.3
http://utashiro.hatenablog.com/entry/20050110/1105360517
会社のファイルサーバーのデフォルトの文字コードをUTF8に変更した後、mgコマンドを使おうとすると、うまく動かないことに気が付きました。LANG=ja_JP.UTF-8
の環境でコマンド行で
$ mg -j jis "日本語" ファイル名
とすると、”日本語"の部分はUTF8になり、mgコマンドにもUTF8で渡されます。UTF8はどうなっているのかと思い、上記のblogを見てみると、対応していないようです。
mg の Unicode 対応
http://utashiro.hatenablog.com/entry/20060927/1159335703
だめもとで、リポジトリを見てみると
mg is obsolete now. use https://github.com/kaz-utashiro/greple instead.
https://github.com/kaz-utashiro/mg
とあり、これからはgrepleを使ったほうがよいようです。
grepleの様子を上記のblogで探してみると…、
greple のリファクタリングと Getopt::EX
http://utashiro.hatenablog.com/entry/2015/02/02/180448
で、2015年2月2日にgreple改修中とあります。となるとリポジトリにある開発版を使ったほうがよいかもしれません。そこで、
https://github.com/kaz-utashiro/greple/tree/develop
から開発版をもってきて動かしてみるとにしました。 手元のFreeBSD 9.1で展開し、
greple-develop/bin/greple 
を動かしてみると…
App::Greple::default: Can't locate App/Greple/default.pm in @INC (@INC contains: /usr/local/lib/perl5/site_perl/mach/5.16 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.16/mach /usr/local/lib/perl5/5.16 /usr/local/lib/perl5/site_perl/5.16 /usr/local/lib/perl5/site_perl/5.16/mach . /home/ss/greple-develop/lib) at (eval 12) line 2.
BEGIN failed--compilation aborted at (eval 12) line 2.
 at /ss/greple-develop/lib/Getopt/EX/Loader.pm line 71.
となり、App/Greple/default.pmというモジュールが必要なようです。
ヤマカンで
greple-develop/lib/App/Greple/default.pm
というファイルを作ってみましたが、同じエラーになります(私はPerlのプログラム作成はできないのです)。そこで、同じディレクトリにあるCommon.pmというファイルを眺めてみました。
package App::Greple::Common;

use strict;
use warnings;

use Exporter 'import';
our @EXPORT      = ();
our %EXPORT_TAGS = ();
our @EXPORT_OK   = qw();

use constant FILELABEL => '__file__';
push @EXPORT, qw(FILELABEL);

*opt_d  = \%main::opt_d;      push @EXPORT, qw(%opt_d);

*setopt = \&main::setopt;     push @EXPORT_OK, qw(setopt);
*newopt = \&main::newopt;     push @EXPORT_OK, qw(newopt);

1;
default.pmというモジュール名からして、形だけあれば動くかもしれないと思い、以下のような先頭の宣言部分と、返り値の部分だけをdefault.pmに書き込んでみました
package App::Greple::default;

1;
そして実行してみると…、今度は動きます。実際に文字列検索をしてみましょう。
$ ./greple-develop/bin/greple "委員会" Mail/*
10:>>(3)運営委員会を、1日目…
15:>> ※運営委員会でも…
となってなんとなく動きます。ただ、いろいろなファイルに試してみると、
utf8 "\x81" does not map to Unicode at ./greple-develop/bin/greple line 753.
という警告が出たり、perlプロセスが長時間動いたたままになったりすることがありました。
オプションを変えて試してみると
$ ./greple-develop/bin/greple --icode=guess "委員会" Mail/*
のように--icode=guessというオプションを付けるとうまくいきそうです。
ということで、システムに入れてみることにしました。ただ、インストーラーがなくこれらのファイルをどのように配置すればよいかよくわかりません。もう少しブログを読んでみると、どうもこのディレクトリ構造のままで置いておくとうまく動きそうなことが書いてあります。
現在の greple はモジュールに分割されてはいるが、clone するなり tz を展開するなりして、実行形式を直接指定するかシンボリックリンクを張れば実行できるようになっている。
そこで greple-developを/usr/local/etcに置き、/usr/local/binからgreple-develop/bin/grepleにシンボリックリンクを張ることにしました。
$ sudo mv -i greple-develop /usr/local/etc
$ cd /usr/local/bin
$ sudo ln -s /usr/local/etc/greple-develop/bin/greple
$ ls -l ./greple
lrwxr-xr-x  1 root  wheel  40  4月 28 16:29 ./greple -> /usr/local/etc/greple-develop/bin/greple
$
実行してみます。
$ greple --icode=guess ありがとう Mail/*
Mail/119:ありがとうございます。
動くようです。
もう少しブログを見てみると
実は greple で PDF ファイルを検索できる
http://utashiro.hatenablog.com/entry/2014/01/10/132004
とか書いてあります。試してみましょう。
$ greple -p "分散" doc/release.pdf
分散電源
… 

$
動きますね。便利かもしれません。