| 作者 | 歌代 和正 | |
| 最新バージョン | 2.26 | |
| 開発中バージョン | 5.0.1.3 |
書いてる暇がないので、昔 Unix Magazine (1993年7月号) に書いた記事から 抜粋。詳しくはマニュアル読んでください。
筆者が作って配布しているコマンドに mg というのがある。これは multi-line grep のことで、普通の grep では1行の中で完結する パターンを検索するのに対して、複数の行に渡るパターンを検索す ることができる。
このコマンドは、そもそも日本語のテキストファイルから単語を検 索するために作ったものである。ご存知の通り日本語には分かち書 きの習慣がない。たとえば、今まで書いた記事の中から「連想配列」 に関して記述してある部分を探そうと思って grep を使っても、 「連想配列」という単語の途中で改行してある部分は探すことがで きない。Emacs を使っていると fill 機能を使ってきれいに右側を そろえてしまうので、特にこれが問題になってくる。
この問題を解決するために mg を作ったのだが (最初は mgrep と いう名前だったがタイプするのが面倒になったために短くした)、 自分で言うのもなんだけれど、これがなかなか便利なので専ら grep の代わりに mg を使っている。複数行に渡る検索以外にも様々 なうれしい機能があるからだが、自分で欲しいと思った機能を付け 加えているのだから当たり前だ。最近の速い grep 系のコマンドに 比べるとさすがに処理速度は負けるが、計算機の処理速度が速くなっ ていることもあり、十分実用的な速度である。少しぐらいできが悪 くても自分で作ったコマンドを使ってやりたいという妙な親心も少 しはあるに違いない。
現在の mg は、Perl 4 でも動作するように作ってある。もはや、Perl 4 でしか動作しないスクリプトを頑張って作る必要もなくて、そろそろ Perl 5 の機能を全面的に生かした形に作り換えてもいいとは思っている。しかし、そ のためには、かなり大規模な改造が必要になることは間違いなくて、なかなか それに踏み切れないでいるというのが実情である。どうせマイナーな変更をす るのだったら、わざわざ Perl 4 で動かないような仕様にする必要もない。 Perl 5 対応の mg の名前は考えてある。 MG5 か mandom のどちらかしか、あり得まい。
約3年ぶりのリリース。 今回の目玉は、ここ数日で追加した --exclude, --include オプション。 コメント等はこちらへどうぞ。
--exclude, --include オプション: 検索する場所を制限する。 たとえば
mg --exclude '(?s)/\*.*?\*/' if *.cのようにすると、C のコメント部分を検索対象から外すことができる。 また、自分で検索範囲を生成する関数を作って指定することができる。 関数定義は ~/.mgrc に書くか、--require オプションでファイルを読み込む。 この機能は翻訳中のテキストから検索を行うために追加したものである。 原文と訳文が混じっているファイルから、訳文のみを対象として検索することができる。 実際かなり便利。
既存のオプションを組み合わせて、ユーザが自分のオプションを定義できるようになった。 指定は ~/.mgrc に書く。
--file オプションを追加して、オプションとして検索対象ファイルを指定できるようにした。 ユーザ定義オプションと組み合わせることで、シェルの alias のように使うことができる
PGP サポートをマシにして gpg に対応した。
--body オプション: メールのボディ部分からの検索。
--pcode, --jis, --euc, --sjis オプション。 入力コードと検索コードを同時に指定するためのもの。 とりあえず入れてみたが残すかどうかは不明。
パターンに look-behind を使えるようにした。ただし、look-behind の部分には可変長のパターンは許されていないため、そのままの形で処理 する。また、単純に処理しているので、パターンの中に閉じ括弧 ) が現 れてはならない。
-f で指定するパターンファイルの中で # で始まる行は無視するよう にした。
単に PGP の機能を入れただけのバージョンです。pgp 2 しかサポートし ていなくて、コマンドも "pgp -f" とハードコーディングしてあります。 処理中何やらいろいろとメッセージが出力されるため、検索対象文字列が 含まれないファイルが大量にある場合には、結果の出力が見えなくなりま す。何とかする方法を調べている暇がないため、そのままリリースしちゃ いますので、対応したり、対応方法がわかる方はお知らせください。
また、現在のパスフレーズの記憶方法にセキュリティ的な問題があると考 える方がいらっしゃいましたら、是非ご連絡ください。
連絡先はこちら
基本的に、Perl 4.036 以上のすべてのバージョンの Perl 処理系で動作する はずです。単純にプログラムファイルをセーブして、実行可能な設定にしてく ださい。
Unix の場合、先頭行で
#!/usr/local/bin/perlのように処理系の場所を指定していますから、別の場所にインストールされて いる場合には、適宜書き換えて利用します。
オプション `-j' を利用する場合には、jcode.pl がインストールされている必 要があります。
マニュアルは、roff の man 形式でプログラム自体に埋め込んであります。
nroff -man mgで整形することもできますし、mg の `-H' オプションを使って見ることもでき ます。HTML, PostScript, PDF 形式に変換したファイルも用意してあります。
プログラム中の著作権および配布条件はこうなっています。
Copyright (c) 2001 Kazumasa UtashiroCopyright (c) 1994-2000 Kazumasa Utashiro Internet Initiative Japan Inc. 3-13 Kanda Nishiki-cho, Chiyoda-ku, Tokyo 101-0054, Japan Copyright (c) 1991-1994 Kazumasa Utashiro Software Research Associates, Inc. Use and redistribution for ANY PURPOSE are granted as long as all copyright notices are retained. Redistribution with modification is allowed provided that you make your modified version obviously distinguishable from the original one. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE DISCLAIMED.
2.25 から、jcode.pl と同じ表記にしました。以下 jcode.pl と同じ。 簡単に言うと
ということです。ここで明らかというのは、一般にはドキュメントの中に書い てある程度では不十分です。普通のユーザは、同じ名前でインストールしてあ れば、その中身やましてや付属ドキュメントなどに目は通さないものです。ユー ザの混乱を防ぐことが目的ですので、是非ご協力ください。もっとも簡単な解 決法としては、名前を変更することをお勧めします。もちろん、汎用性の高い 変更であればオリジナルに反映しますので、お知らせください。煮るなり焼くなりなんとでもしてください。ただし、改変して再配布する ときには、オリジナルと異なっているということが明らかな形態で配布し てください。もちろん、これを使ってどんなことが起こっても作者は一切 責任はとりません。
改変無しの再配布に際しては、事前に確認や連絡を頂く必要はありません。 もちろん、連絡頂くことは構いませんし、タイミングによっては何かアドバイ スを差し上げることもできるかもしれません。
Subject: mg-2.23 released
From: utashiro@iij.ad.jp
Newsgroups: fj.comp.lang.perl
Date: 30 Sep 2000 23:40:24 +0900
Organization: Internet Initiative Japan Inc.
mg-2.23 をリリースします。
ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/mg-2.23
変更点は、
(1) substr の使用法を変更することでの効率化 (えんどう氏の指摘による)
(2) パターンの中に back-reference が含まれていたときに正常に検索できな
いバグを解決
(3) -dp オプションで、終了する前に自分のプロセスに関する ps の出力を表
示
という3点です。
(2) については、まだ完全ではない部分もあると思いますので、何か問題を発
見してたらご連絡ください。これは、
mg -e '(は|が|に|を)\1' ...
のようなパターンを検索するときに、パターンを自動的に
/((は|が|に|を)\2)/
のように修正するものです。とりあえず、\9 より大きい番号が指定された場
合は処理できません。
In article <20000831.034812.115996198.utashiro@iij.ad.jp>,
wrote:
>デバッグ用に、exit() する前に
>
> if ($db_p) {
> open(STDOUT, ">&STDERR");
> system "ps -l -p $$";
> }
>
>というコードを入れて、-dp すると終了する前に ps の出力を出すようにして
>みようかと思います。Unix しか考えていませんが、System V 系でもこれでい
>けるでしょうか?
特に何も連絡はなかったので、このまま入っています。
配列長を短くした時の perl4 と perl5 の違いについては、今まで知りません
でした。前田さん、ありがとうございます。以前、フォローを送ったのですが、
失敗しました。
ところで、perl4 のサポートを終了しようと思うのですが、よろしいでしょう
か? まだリリースしてませんが、以前送った PGP の鍵処理では、perl4 をサ
ポートするつもりは今のところありません。
--utashiro
PGP で暗号化されたメールを検索したいこともある。それを自動的にやっ てくれる機能を追加してみたのだが、まだ整理していなくて正式にサポートは していない。さすがに面倒になってきたので、これは Perl5 の文法で書いた のも一因ではある。テンポラリファイルの作り方はいい加減で、 IO::File->new_tmpfile とかを使った方がいいのかもしれない。
Subject: pgp capable mg
From: utashiro@iij.ad.jp
Newsgroups: fj.comp.lang.perl
Date: Thu, 31 Aug 2000 04:15:29 +0900 (JST)
Organization: Internet Initiative Japan Inc., Tokyo, JAPAN
さて、逃避ついでに mg に pgp で暗号化されたメッセージを検索する機能を
追加しようとしています。-k オプションを付けると環境変数 PGPPASSFD を設
定して -z オプションで指定したフィルタコマンドを実行します。
if ($opt_k) {
use Fcntl;
my $passfile = "/tmp/invisible_passfile_$$";
my $passphrase;
sysopen(PGPPASS, $passfile, O_RDWR|O_CREAT|O_EXCL, 0000)
or die "sysopen $passfile: $!\n";
unlink($passfile)
or die "can't unlink $passfile: $!\n";
fcntl(PGPPASS, F_SETFD, 0)
or die "can't fcntl F_SETFD: $!\n";
print STDERR "Enter PGP Passphrase> ";
system "stty -echo";
$passphrase = ;
system "stty echo";
print STDERR "\n";
syswrite(PGPPASS, $passphrase, length $passphrase);
$passphrase =~ s/./\0/g;
$passphrase = "";
seek(PGPPASS, 0, 0);
$ENV{PGPPASSFD} = fileno(PGPPASS);
}
パスフレーズを格納する方法は、次のようなものです。
1. 一時ファイルをオープン (作成) する
2. 直ちにそのファイルを unlink する
3. オープンした Filehandle を close-on-exec しないように設定
4. 標準入力からパスフレーズを読み込む
5. ファイルに書き込む
6. パスフレーズを保持している変数の内容を破壊
7. 環境変数 PGPPASSFD を設定
8. ファイルの先頭に seek
9. フィルタコマンドを実行
10. ファイルの数だけ 8-9 を繰り返す
11. 終了する前にファイルバッファの内容を書き換えて破壊
この方法で、セキュリティ的に問題になる点がある、あるいはもっと優れた方
法があるという意見がありましたら、ご連絡ください。
--utashiro
いつまで放っておいても仕方ないので、PGP の自動復号機能をサポートし たバージョンをリリースします。ただ、これは Perl5 の機能を使っていて、 それをわざわざ Perl4 に書き直すのも無駄なので、以降は Perl4 はサポート しないことにします。そのためバージョンも改めて 5.x シリーズとします。
ついでに、最早使われなくなったものが残っていたりして混乱を極めてい るコマンドラインオプションも整理することにしましょう。
とりあえず、5.0.1.1 からリリースし、5.0.1 ブランチの間は大幅な仕様 変更も認めることとします。このバージョンの仕様は将来変更される可能性が ありますので、そのつもりでお使いください。