Zshだけ答える...

Zshだけ答える...

私の部分文字列はstring=substr1-substr2-substr3.substr4可変長です。私はsubstr3それから抽出したいと思い、それを行うために文字列操作拡張を使用stringしようとしています。このアプローチでは、生成された拡張機能を引き続き実行する必要があり、その逆も同様です。私の質問は次のとおりです${string##pattern}${string%pattern}${string##*-}${string%.*}

  1. これが最善の選択ですか?
  2. では、どのように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

おすすめ記事