シェルスクリプトで二重引用符を含む部分文字列の位置をどのように取得しますか?

シェルスクリプトで二重引用符を含む部分文字列の位置をどのように取得しますか?

長い文字列があり、最初に表示される部分文字列を探したいのですが、部分文字列に二重引用符が含まれています。私が知っている唯一の方法は次のとおりです。

mystr='a very, very, extremely, incredibly long string of text that contains the phrase he said, "Hello!" somewhere in the middle'
strpos=`expr index "$mystr" Hello`
echo $strpos

92を返します。ただし、部分文字列に二重引用符が含まれている場合は機能しません。

strpos=`expr index "$mystr" he said, "Hello`

二重引用符(およびスペース)をエスケープしてみました。文字列を一重引用符で囲んで見つけようとしました。 「予期しないEOF」や「構文エラー」を受信せずに実行すると、「2」のような途方もない結果が返されます。 (このポジションは何千ものありexpr indexます)できる私はしますか?

答え1

私の考えでは、最初の文字列から2番目の文字列の文字を検索していると思います。グレブを使用できます

mystr='a very, very, extremely, incredibly long string of text that contains 2 the phrase he said, "Hello!" somewhere in the middle'
echo "$mystr"| grep -o -b Hello!

それは戻ってきます91:Hello!。ここで、インデックスは0から始まります。

同じ状況が複数回発生した場合、出力は次のようになります。

0:a 58:a 65:a 77:a 85:a

二重引用符も検索するにはエスケープしてください。

echo "$mystr"| grep -o -b \"Hello!\"

出力は次のとおりです

90:"Hello!"

答え2

パラメーター拡張のみを使用してください。

mystr='a very, very, extremely, incredibly long string of text that contains the phrase he said, "Hello!" somewhere in the middle'  
searchstr='"Hello!"'
newstr="${mystr%%$searchstr*}"
echo "position = $((${#newstr} + 1))"

答え3

これがあなたが探しているものであることを確認しましょう:

mystr='a very, very, extremely, incredibly long string of text that contains the phrase he said, "Hello!" somewhere in the middle'

$ var=$(echo "$mystr" | grep -o -b "Hello!" | head -1)
$ echo "$var"
91:Hello!
$ pos="${var%:*}"
$ echo "$pos"
91

関連情報