Eu gosto de fazer globs não gananciosos, mas minhas pesquisas no Google sugerem que isso não é suportado. É este o caso? Em caso afirmativo, por que é o caso?
Por exemplo, eu gostaria de usar um glob não ganancioso em expansões de histórico, por exemplo, ^ff* ^open
para abrir um mp3 anteriormente reproduzido.
Zsh não tem curingas não gananciosos. O único lugar em que consigo pensar onde ele faz correspondência não gananciosa é ao remover um prefixo com os formulários de substituição de parâmetro
${VAR#PATTERN}
e${VAR%PATTERN}
(em oposição a${VAR##PATTERN}
e${VAR%%PATTERN}
que correspondem vorazmente).É sempre possível traduzir um padrão usando curingas não gananciosos em um que não os use, mas a tradução pode ser dolorosa e o tamanho do resultado é exponencial em relação ao tamanho do original no pior caso. Um exemplo clássico de quando a correspondência não gananciosa seria conveniente é quando você deseja corresponder um intervalo numérico seguido por outra coisa com, por exemplo
<1-42>*
: this matchs43a
porque<1-42>
matches4
; uma solução é<1-42>([^0-9]*)#
. Dependendo do que você deseja fazer, outros métodos podem ser mais fáceis, por exemplo, usar um prefixo ou substituição de sufixo ou abordar o problema de um ângulo diferente.Para o caso de uso de uma expansão de histórico em que você deseja alterar o comando, há uma abordagem diferente que é um caractere mais curto como seu exemplo e é mais confiável em seu exemplo específico. Em vez de
^ff* ^open
que correspondeff
a qualquer lugar na linha de comando e só funciona se o argumento não contiver um espaço, você pode usarque corresponde apenas
ff
no início da linha de comando (!?ff
corresponderia a qualquer lugar).