メール本文などのJISコードで保存されている日本語ファイルから文字列を検索するためにmgというプログラムを使っていました。
mg-5.0.1.3会社のファイルサーバーのデフォルトの文字コードをUTF8に変更した後、mgコマンドを使おうとすると、うまく動かないことに気が付きました。LANG=ja_JP.UTF-8
http://utashiro.hatenablog.com/entry/20050110/1105360517
の環境でコマンド行で
$ 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.とあり、これからはgrepleを使ったほうがよいようです。
https://github.com/kaz-utashiro/mg
grepleの様子を上記のblogで探してみると…、
greple のリファクタリングと Getopt::EXで、2015年2月2日にgreple改修中とあります。となるとリポジトリにある開発版を使ったほうがよいかもしれません。そこで、
http://utashiro.hatenablog.com/entry/2015/02/02/180448
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.となり、App/Greple/default.pmというモジュールが必要なようです。
BEGIN failed--compilation aborted at (eval 12) line 2.
at /ss/greple-develop/lib/Getopt/EX/Loader.pm line 71.
ヤマカンで
greple-develop/lib/App/Greple/default.pmというファイルを作ってみましたが、同じエラーになります(私はPerlのプログラム作成はできないのです)。そこで、同じディレクトリにあるCommon.pmというファイルを眺めてみました。
package App::Greple::Common;default.pmというモジュール名からして、形だけあれば動くかもしれないと思い、以下のような先頭の宣言部分と、返り値の部分だけをdefault.pmに書き込んでみました
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;
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動きますね。便利かもしれません。
分散電源
…
$