2017-01-26 5 views
1

Пусть даны Zsh массив MyArray, я могу сделать из него массив подмножествоФильтрация ЗШ массива по маске

set -A subarray 
for el in $myarray 
do 
    if [[ $el =~ *x*y* ]] 
    then 
    subarray+=($el) 
    fi 
done 

, который в данном примере, содержит все элементы из MyArray, которые имеют где-то х и y, в указанном порядке.

Вопрос:

Учитывая множество операций с массивами, доступных в Zsh, есть более простой способ достижения этой цели? Я проверил справочную страницу и zsh-lovers page, но не нашел ничего подходящего.

ответ

3

Это должно сделать трюк

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

Вы можете найти объяснение в [разделе о Parameter Expansion] в ЗШ страницы руководства. Он немного скрыт в ${name:#pattern} без флага (M) делает противоположное тому, что вы хотите:

${name:#pattern}

Если pattern соответствует значению name, затем заменить пустую строку; в противном случае просто замените значение name. Если name является массивом, элементы сопоставления массива удаляются (используйте флаг (M) для удаления несогласованных элементов).