bash:1つのステップで複数の文字列操作(パラメーター展開)を使用するにはどうすればよいですか?
私が持っているstring=substr1-substr2-substr3.substr4
部分文字列が可変長であるところ。から抽出substr3
したいので、文字列操作展開string
を使用してそれを行うことを考えています。このアプローチを使用すると、結果の拡張で実行して実行する必要があることは明らかです。その逆も同様です。私の質問は次のとおりです。${string##pattern}
${string%pattern}
${string##*-}
${string%.*}
- これが最良の選択ですか?
- はいの場合、1つのステップで両方を実行するにはどうすればよいですか?のようなことをしようとしたとき、
${string##*-${string%.*}}
または${string%.*${string##*-}}
文字列全体を取り戻したとき。最初のステップの結果に中間変数を割り当て、それを操作することで、常に2つのステップで抽出を実行できることに気付きました。でも一気にやりたいです。どうすればいいですか?
TIA!
回答
与えられた
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
containgにつながりsubstr3
ます。
Zshでは、1つのステップでそれを行うことができます:、しかし、それはBashでは機能しません。result=${${string%.*}##*-}
Bashでは、#
またはの右側で拡張を使用するように制限され%
ていますが、文字列の最初と最後の両方からパーツを削除する必要があるため、ここでは役に立ちません。
または、$string
改行文字が含まれていない場合は、
IFS=.- read -r a b c d <<< "$string"
から読み上げsubstr3
ますc
。
その場合、シェルと文字列のサイズに応じて、の内容は$string
一時ファイルに保存されるか、パイプを介して供給され、パイプread
から最初の行が読み取られ、に従って分割され$IFS
ます。