web-dev-qa-db-ja.com

agrepでワード長を指定しますか?

agrepを使用して、類似したスペルの単語を検索しています。次に例を示します。

agrep -1 hack /usr/share/dict/words

しかし、返される単語が多すぎるので、単語の長さがキーワードと同じであることも願っています。どうすれば指定できますか?

6
Tim

1つのagrepを使用する

agrepを使用するための鍵は、文字の追加、置換、削除などのコストを制御できることを認識することです。挿入の場合は-Iスイッチ。削除の場合は-D

$ agrep -1 -I2 -D2 '^hack$' /usr/share/dict/words

$ agrep -1 -I2 -D2 '^hack$' /usr/share/dict/words
back
cack
fack
haak
hack
haik
hank
hark
hask
hawk
heck
hick
hock
huck
Jack
jack
lack
Mack
mack
Pack
pack
rack
sack
tack
Wack
wack
yack
Zack
zack

詳細

したがって、挿入のコストを許容できるエラーの数よりも1高く設定し、削除のコストについても同じことを行うと、文字を挿入または削除することはなく、長さを維持します。一致するパターンの長さ、hack、つまり4。

したがって、上記のコマンドでは、許容誤差を1(-1)。挿入または削除のコストを2に設定しました(-I2 -D2)。そして、パターンで始まり、パターンで終わる単語全体である文字列のみに一致するように、結果を保護しました(^hack$)。

注:キャレット(^)は文字列の始まりを意味し、ドル記号($) 終わり。これらはアンカーと呼ばれます。

2つのagrepを使用する

別の方法として、2つのagrepを使用することもできます。

$ agrep '^[a-zA-Z]{4}$' /usr/share/dict/words | agrep -1 'hack'

$ agrep '^[a-zA-Z]{4}$' /usr/share/dict/words | agrep -1 'hack'
back
cack
Chac
Chak
dhak
fack
haak
hack
haik
hake
hako
haku
hank
hark
hask
hawk
heck
hick
hock
huck
Jack
jack
lack
Mack
mack
Pack
pack
rack
sack
Shak
tack
thak
Wack
wack
yack
Zack
zack

詳細

最初のagrepは、長さが4文字の文字列のセットを見つけるタスクです。 2番目のagrepは、このセットをさらにhackのパターンに一致する文字列のみに減らし、単一のエラーを許可します。

5
slm