Hello, I have an array, for example: local -a list list=("... one giraffe ..." "... two cows ..." "... one monkey ..." "... three lemmings ...") ("..." can represent anything) and I want to get parts of each item each time a specific pattern occurs. For example, I want to get the word after "one". I therefore want to finish with an array containing ("giraffe" "monkey") I found a way with a loop : local -a secondlist local item for item in $list; do if [[ $item = (#b)*one\ ([a-z]#)* ]]; then secondlist=($secondlist $match[1]) fi done print -l $secondlist Great, works fine. But I was wondering if there was something more zsh-ish that could allow me to do it in one instruction. I found : print -l ${${(M)list##*one ([a-z]#)*}//(#b)*one ([a-z]#)*/$match[1]} but I think this is inefficient as the pattern has to be evaluated twice. What would be the better way to do that ? thanks