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