计算 zsh 数组中的模式匹配数

计算 zsh 数组中的模式匹配数

我正在寻找与中的建议类似的东西这个答案:

给定一个 zsh 数组,我想要计算有多少元素与模式匹配(而不是获取第一个/最后一个匹配或第一个/最后一个匹配的索引,就像rRiI下标标志所做的那样)。

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

结合三个参数扩展特征:

  • ${…:#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

相关内容