
私の部分文字列はstring=substr1-substr2-substr3.substr4
可変長です。私はsubstr3
それから抽出したいと思い、それを行うために文字列操作拡張を使用string
しようとしています。このアプローチでは、生成された拡張機能を引き続き実行する必要があり、その逆も同様です。私の質問は次のとおりです${string##pattern}
${string%pattern}
${string##*-}
${string%.*}
- これが最善の選択ですか?
- では、どのように1つのステップで両方を実行できますか?私が
${string##*-${string%.*}}
何かをしようとしたとき、または${string%.*${string##*-}}
私は完全な文字列を返します。最初のステップの結果に中間変数を割り当ててそれを行うと、常に2つのステップで抽出を実行できることがわかりますが、1つのステップで実行したいと思います。私は何をすべきですか?
ティア!
答え1
与えられた
string=substr1-substr2-substr3.substr4
${string%.*}
はい
substr1-substr2-substr3
${string##*-${string%.*}}
そうですね
${string##*-substr1-substr2-substr3}
これは、string
最初から含めてすべてを削除することを意味します-substr1-substr2-substr3
。しかし、string
前にダッシュがないので、そのような部分文字列がないので、substr1
元の文字列を取得します。
おそらくあなたが望むもの
string=substr1-substr2-substr3.substr4
result="${string%.*}"
result="${result##*-}"
これresult
によりインクルードが発生しますsubstr3
。
Zshでは1つのステップでこれを実行できますが、result=${${string%.*}##*-}
Bashでは機能しません。
#
Bashでは、orの右側でのみ拡張を使用できます%
。これは文字列の先頭と末尾を削除する必要があるため役に立ちません。
または、$string
改行文字が含まれていない場合は、次のものを使用できます。
IFS=.- read -r a b c d <<< "$string"
そしてsubstr3
で読んでくださいc
。
この場合、シェルと文字列のサイズに応じての内容は一時$string
ファイルに保存されるか、パイプを介して供給され、最初の行をread
読み取り、それに応じて分割されます$IFS
。
答え2
この質問はbashに関するものですが、Zshを使用して検索でこの問題を経験している人には役立ちます。
Zshだけ答える...
...他のシェルがあるかもしれませんが、bashではないかもしれません(5.1.16)
Zshで複数の文字列置換を実行するには、入れ子にすることができます。パラメータ拡張:
string=substr1-substr2-substr3.substr4
result=${${string##*-}%.*}