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)