長い文字列で変更される部分文字列の開始位置を見つける方法

長い文字列で変更される部分文字列の開始位置を見つける方法

私は200文字以上の長い文字列をファイルに保存します。すべての文字列には、0から9の数字、##XXX###XXXXAとZの間の大文字、小文字などのパターンがあります。先行および末尾の文字は、およびを除くスペースを含む印刷可能な任意の文字にすることができます。さらに、この文字列の長さは固定されていませんが、180文字以上で、ほとんどが200文字を超える。#X[0-9][a-z][A-Z]

私にとって必要なのは、Perlのindex関数によって返された長い文字列のパターンの開始位置だけです。このシステムにはPerlがなく、追加のソフトウェアをインストールする機会もないことに注意してください。

これまで私が考えることができるのは、文字列の最初の文字から始めて、私が得た文字が数字であることを確認することです。その場合は、2番目が数字であることを確認してください。これまでなど...カスケードifステートメントを使用して12文字がすべて満たされるまで繰り返し、比較チェーンの条件が数が12文字に達する前に満たされていない文字を返すと、ループを中断します。

正規表現を使用または使用せずにどのようなことができるのか疑問に思います。これにより、bashで12個のカスケードifステートメントは必要ありません。はい、人生がより快適になったら、sedとawkを使用できます。

答え1

< your_file \
tr -c \[:alnum:] '[\n*]' |
grep -n ............

...おそらく?stringsまた、非常に便利です...

< your_file \
tr -c \[:alnum:] '[\0*]' |
strings -n12 -td

答え2

外部ツールを呼び出すことなく(速く?):

while IFS= read -r a; do
    head=${a%%[[:alnum:]]*}
    tail=${a##*[[:alnum:]]}
    a=${a##"$head"}
    b=${a%%"$tail"}
    printf '%4d <%s>\n' "${#head}" "$b"
done < file.csv

答え3

awkには、match好きなように聞こえる機能を実行する機能があります。

awk '{ print match($0, /[0-9][0-0]rest_of_your_pattern/) }' your_file

一致するものがない場合、一致が返され、0印刷されます。

関連情報