使用通配符过滤zsh数组

7
给定一个Zsh数组myarray,我可以从中制作一个子集数组。
set -A subarray
for el in $myarray
do 
  if [[ $el =~ *x*y* ]]
  then
    subarray+=($el)
  fi
done

在这个例子中,myarray 中所有同时包含 xy 的元素都被包含在其中。
问题:
鉴于 zsh 中有大量的数组操作可用,是否有更简单的方法来实现这一点?我查看了手册和 zsh-lovers 页面,但没有找到合适的内容。
1个回答

11

这应该能解决问题

subarray=(${(M)myarray:#*x*y*z})

您可以在zsh手册的参数展开部分中找到解释。如果没有标志(M),那么${name:#pattern}做的是与您需要的相反的事情,因此有些隐藏:

${name:#pattern}

如果pattern匹配name的值,则替换为空字符串;否则,只替换name的值。如果name是一个数组,则删除匹配的数组元素(使用(M)标志来删除未匹配的元素)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接