globs não gulosos (estendidos) no zsh

1

Eu gosto de fazer globs não-gananciosos, mas minhas pesquisas no Google indicam 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.

    
por HappyFace 15.10.2018 / 06:49

1 resposta

1

O Zsh não possui curingas não-gulosos. O único lugar em que consigo pensar em 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 a greedily).

É sempre possível traduzir um padrão usando curingas não-vorazes em um que não os use, mas a tradução pode ser dolorosa e o tamanho do resultado é exponencial no tamanho do original no pior dos casos. 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>* : corresponde a 43a porque <1-42> corresponde a 4 ; uma solução alternativa é <1-42>([^0-9]*)# . Dependendo do que você deseja fazer, outros métodos podem ser mais fáceis, por exemplo, organizar o uso de 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 corresponde a ff em qualquer lugar na linha de comando e só funciona se o argumento não contiver um espaço, você pode usar

open !ff:*

que corresponde apenas a ff no início da linha de comando ( !?ff corresponderia em qualquer lugar).

    
por 19.10.2018 / 09:17