Que significado especial tem “#” dentro de um padrão de expansão de parâmetro?

5

Suponha que eu tenha definido uma variável como

number=123#456

e eu quero imprimi-lo sem o "123 #". (Esse tipo de coisa acontece em zsh quando você está trabalhando com números em bases diferentes de 10.) Seção "Parâmetro Expansão" do manual diz,

${name#pattern}

${name##pattern}

If the pattern matches the beginning of the value of name, then substitute the value of name with the matched portion deleted; otherwise, just substitute the value of name. In the first form, the smallest matching pattern is preferred; in the second form, the largest matching pattern is preferred.

Isso sugere que eu deveria ser capaz de dizer

print ${number#123#}

para se livrar do "123 #", mas isso realmente gera "3 # 456". Descobri que posso obter o efeito desejado se escapar do “#” que estou tentando remover:

print ${number#123\#}    # prints "456"

Qual foi o significado especial que o "#" teve antes de eu escapar?

    
por bdesham 23.06.2018 / 19:34

1 resposta

8

# é um operador glob que significa "zero ou mais ocorrências de o caractere precedente ou grupo entre parênteses ”. É a maneira zsh de escrever o operador * regex. Assim, 123# corresponde a 12 no início de 123#456 ao receber a correspondência mais curta ( ${number#123#} ) e corresponde a 123 ao fazer a correspondência mais longa ( ${number##123#} ).

O operador # só está ativo quando a opção extended_glob é conjunto. Esta opção não é configurada por padrão, mas é comum configurá-la em sua configuração (porque é bastante útil e não incomodativa) e é sempre definida durante a execução das funções de conclusão.

    
por 23.06.2018 / 20:48

Tags