特定の順序に従う単語を見つける方法

特定の順序に従う単語を見つける方法

私は複数の文字が与えられたときに可能なすべての単語を見つけることができるスクリプト(script1.sh)を書こうとしています。

  • 言葉はパブの最初の文字で始まり、最後の文字で終わらなければなりません。

  • 単語の文字は、パブの文字の順序に従う必要があります。

  • 混乱の各文字は複数回使用できます。

だからこれ

./script1.sh "qwertyuytresdftyuiokn"

出力する必要がqueenありますが、question「e」が「u」と「i」の前に混同されて現れるので、「quieten」してはいけません。

最初、最後、および残りの文字を変数に割り当ててから、egrepを使用して単語を検索しようとしましたが、アルファベット順の使用方法が見つかりませんでした。だからこれも私に間違った言葉を与えます。

#!/bin/bash

first_letter=$(echo $@ | cut -c1)
last_letter=$(echo $@ |rev| cut -c1)
remaining_letters=$(echo $@ | cut -c2- | rev | cut -c2-)

grep -E "^$first_letter[$remaining_letters]*$last_letter$" /usr/share/dict/words

その後、パクパクを配列に変えようとしましたが、パクパクの順序に従う単語を見つける方法を見つけることができませんでした。

ベストアンサー1

#!/bin/sh
pttrn="^$(printf '%s' "$1" | sed -e 's/\(.\)/\1*/g' -e 's/\*/\\+/' -e 's/\*$/\\+/')"'$'
grep "$pttrn" /usr/share/dict/words

*各文字の後にパターンを挿入して、最初の引数からパターンを取得します。その後、最初の項目が。*に変更され、\+最後の項目も同様です*。また、と^$入力例では、次のパターンを生成します。

^q\+w*e*r*t*y*u*y*t*r*e*s*d*f*t*y*u*i*o*k*n\+$

これは正しいパターンですgrepq開始は少なくとも1回は発生し、n終了は少なくとも1回発生する必要があります。中央の各文字は0回以上表示され、順序は変更されません。

このスクリプトは愚かです。.など[で入力を提供すると、仕様外の正規]表現が得られます。合理的な入力を提供するか、スクリプトを拡張してこれを確認してください。


例:

$ ./script1.sh qwertyuytresdftyuiokn
queen
question
$ ./script1.sh te
tee
$ ./script1.sh superuser
seer
serer
spur
super
supper
surer
$

おすすめ記事