zsh配列のパターンマッチ数の計算

zsh配列のパターンマッチ数の計算

私は提案に似たものを探しています。この回答:

rRiIzsh配列が与えられたら、パターンに一致する要素の数を計算したいと思います(下付き文字フラグのように、最初/最後の一致または最初の/最後の一致のインデックスを取得する代わりに)。

myarray=(-test.list -test.v -c spam fiddle)

if ((${myarray[(I)-test.*]})); then
   echo "there is at least one test flag"
   echo "there are <solution here> test flags"
   if ((<solution here> >= 5)); then
      echo "seriously, there are many test flags"
   fi
fi

理想的には、スライスと組み合わせて可能でなければなりません。

if ((${array[2,$end][(I)-test.*]})); then
   echo "there are <solution> test flag(s) in the range I consider interesting"
fi

答え1

3つを結合するパラメータ拡張特徴:

  • ${…:#PATTERN}一致する要素をフィルタリングしますPATTERN
  • (M)一致する要素を保持します(このフラグがない場合、フィルタは一致する要素を削除します)。
  • ${#…}計算結果要素。
if [[ -n ${(M)myarray:#-test.*} ]]; then
   echo "there are ${(M)#myarray:#-test.*} test flags"

下付き文字と組み合わせることもできます。

% echo ${(M)#myarray[1,-1]:#-test*}
2
% echo ${(M)#myarray[2,-1]:#-test*}
1

関連情報