Desça até “ Generation de nome de arquivo ” e ative extended_glob (que deve ser o padrão, mas não é para compatibilidade com versões anteriores) ou ksh_glob . Os globs estendidos e os ksh's de zsh têm o poder total das expressões regulares.
ERE syntax ksh glob zsh extended glob
(foo)* *(foo) (foo)#
(foo)+ +(foo) (foo)##
(foo)? ?(foo) (|foo)
(foo|bar) @(foo|bar) (foo|bar)
Lembre-se de que a maioria das ferramentas que usam expressões regulares as usam como padrões pesquisa que devem corresponder a uma substring, mas globs sempre são usados como padrões que devem corresponder à string inteira. Por exemplo, foofoobar não corresponde ao zsh glob (foo)## , já que depois de foofoo sobrou algum texto.
O Zsh possui operadores adicionais que não ampliam o poder expressivo, mas tornam algumas expressões mais fáceis de serem escritas. Os operadores ^ e ~ ( extended_glob ) e !(…) ( ksh_glob ) fornecem negação, e. ^foo ou !(foo) corresponde a qualquer coisa, exceto foo , que na sintaxe de regex requer o |[^f].*|f[^o].*|fo[^o].* pesado. O operador <…-…> (específico de zsh, não requer extended_glob ) corresponde a qualquer número inteiro (em notação decimal) em um intervalo, por exemplo, <3-11> corresponde 3 e 10 mas não 30 ou 1 .
Portanto, excluindo problemas como caracteres não imprimíveis, ls | grep -e "ABC[0-9]\+" pode ser escrito de maneiras como
print -lr -- *ABC[0-9]##*(N) # requires extended_glob
print -lr -- *ABC+([0-9])*(N) # requires ksh_glob
print -lr -- *ABC+<->(N)
Mas como “um ou mais dígitos e qualquer coisa” é equivalente a “um dígito e qualquer coisa”, também pode ser escrito
print -lr -- *ABC[0-9]*(N)