作者: 藤岡和夫
日時: 2007/10/17(20:47)
On Wed, 17 Oct 2007 17:40:39 +0900 (JST)
kbk@... (Bruce.) さんwrote:

> ずいぶんとご無沙汰だったような気がしますが。

 ご無沙汰しました^^; 

 実はBecky!のスパムフィルタに邪魔されていました^^;;;というのが半分は本
当ですね。

> >  オートマトンというよりは単に文字列の比較なんですけどね。文字列の先頭か
> > ら比較する。カとガは区別します。AWKでも同様なアイデアで書けると思います
> > が・・・AWKではsplitで空文字列で文字列を文字単位で分割できなかったかな。
> 
> よほど古いのでなければ文字単位の分割になります。
> #POSIXでそういう規則になったから

 なるほど、jgawkでは動かないけど、gawkは動きました^^)v

-----^ agrep.awk
# usage: gawk -f agrep.awk 2 ハンカチ王子 agrep.txt
BEGIN{
	misn = ARGV[1]
	pattern = ARGV[2]
	split(pattern, chars, "")
	while(getline s < ARGV[3]){
		split(s, charsin, "")
		for (i in chars){
			if(chars[i] != charsin[i]){
				mismatch++
			}
		}
		if(mismatch <= misn){
			print s;
		}
		mismatch = 0;
	}
}
-----$
-----^ agrep.txt
ハニカミ王子
ハゲカケ王子
ハナカミ王子
ハミガキ王子
ハイカイ王子
ハダカノ王子
ハルカゼ王子
トンカツ王子
-----$

 このようなデータ依存の初歩的なスクリプトではなく、文中にあるようなテキ
ストから一般的に抽出したいなら、スクリプト自体を生成して、evalみたいなこ
とをすれば可能でしょうね。まず/..カチ王子/,/.ン.チ王子/,...みたいなパター
ンを元の検索文字からすべて生成して、どれにでもマッチするようなループを生
成するというような感じ。このように複雑なことをやるならPerlのほうが適して
いると思います。

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