任意の量のテキストを一致に含めることができるオプションのテキストの前のブロックを含むエッジ固定テキストを検索したいと思います。たとえば、私が、、、、、、を見つけようとしていますが、受け入れようと^xyz
しているとします。^wxyz
^vwxyz
^uvwxyz
^tuvwxyz
^stuvwxyz
^rstuvwxyz
他の可能性はありません。[r-w]
(実際の検索では、先行文字の実際のブロックがこの単純化された例のようにアルファベット順になっていないため、単に正規表現の文字シーケンスを使用することはできません。)このegrep '^r?s?t?u?v?w?xyz'
検索を作成する別の方法はありますか?オプションのフラグ(?
)を各要素に個別に適用するのではなく、シーケンス全体に簡単に適用できますか?
編集する:
以下は、より現実的なデータの例です。一致させるフルテキストはAZHDEOIMOSJDJKEJLCNです。ただし、文字は左端からさまざまな角度に欠けているため、以下のすべてが一致する必要があります。
^AZHDEOIMOSJDJKEJLCN
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
したがって、残差KEJLCN
は必須であり、それ以前のすべてはオプションです。ただし、単にgrep
for を使用することはできません。KEJLCN
これは、インスタンスが行の先頭(^
)にのみ固定され、オプションで上記の他の文字が前に来るためです。さらに、検索文字列は変数内にあり、スクリプトの部分文字列操作KEJLCN
によって最小残差(例:)が抽出されます(たとえば、egrep
検索テキストのシステムコマンドとして実行されるPerl環境では、デフォルトの$query
テキストが含まれます)。substr($query,-6)
この場合、オプションの前のテキストが)の中に表示されますsubstr($query,0,length($query)-6
。したがって、このソリューションは文字列リテラルだけでなく、変数型の正規表現でも機能します。
答え1
grep '[[:lower:]]*xyz'
このパターンに一致するすべての行が返されます。しかし、もちろん、これは明示的な文字の順序と一致しません。
しかし、これはあなたが解決した問題のようです。
grep -f - <<\STRINGS /dev/fd/3 3<<\DATA
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
出力
SJDJKEJLCN
JDJKEJLCN
プログラムで同じルックアップテーブルを作成したい場合...
grep -f - <<STRINGS /dev/fd/3 3<<\DATA
$(
MATCH=ZHDEOIMOSJDJKEJLCN
until [ ${#MATCH} -lt ${MINLEN=6} ]
do printf '^%s\n' "$MATCH"
MATCH=${MATCH#?}
done
)
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
出力
SJDJKEJLCN
JDJKEJLCN