Significado de “[--0]” em um padrão glob

5

Eu estava lendo sobre "Glob" e "Globbing Pathnames", e achei essa parte estranha (para mim) em man pages :

"[--0]" matches the three characters '-', '.', '0', since '/' cannot be matched.

Estou confuso! Como dois traços e um 0 correspondem a . ? Qual é o papel do caractere / aqui? Isso é um bug na página man?

    
por Mohammad Dehghan 19.12.2014 / 08:56

2 respostas

5

Como explicado no início desse parágrafo em essa página man , '- 'caractere, quando colocado entre dois caracteres , representa um intervalo de caracteres, e também,' - 'caractere, quando colocado como primeiro ou último caractere entre colchetes , tem seu literal significado. Portanto, o primeiro traço realmente significa um caractere '-' e o segundo traço é um especificador de intervalo. Portanto, o padrão inteiro consiste em todos os caracteres entre '-' e '0', que, no código do idioma C / POSIX (mas geralmente não em outros), são:

-
.
/
0

e porque '/' não pode ser correspondido , o padrão corresponde a três caracteres '-', '.', '0'.

    
por 19.12.2014 / 08:56
1

Isso não tem nada a ver com as próprias páginas man: é uma descrição da sintaxe dos padrões globais, sobre os quais a página do manual está.

Em um padrão glob, os colchetes delimitam um conjunto de caracteres. Por exemplo, [abc] corresponde a qualquer um dos caracteres a , b ou c . O padrão fo[abc] corresponde a foa , fob e foc (mas não, por exemplo, foo ou fo ou foab ).

Dentro dos parênteses, o caractere - tem um significado especial: é usado para formar um intervalo de caracteres. Portanto, em vez de corresponder a 0 , - ou 9 , o padrão [0-9] corresponde a qualquer dígito. Os intervalos podem ser combinados com outros intervalos e caracteres solitários; por exemplo, [A-Za-z_] na codificação ASCII corresponde a qualquer letra ou sublinhado.

O sinal de menos é interpretado apenas como um indicador de intervalo quando isso seria sintaticamente sensato: se for o primeiro ou último caractere dentro dos colchetes, ou se vier imediatamente após outro intervalo, - significa ele mesmo. Portanto, em [--0] , o primeiro - significa ele mesmo e o segundo - é um indicador de intervalo, portanto, esse padrão corresponde a qualquer caractere que esteja entre - e 0 na localidade atual.

Na codificação ASCII , esse intervalo abrange os quatro caracteres a seguir: - , . , / , 0 . O caractere / não pode aparecer dentro de um nome de arquivo, porque é sempre interpretado como um separador de diretório; portanto, o padrão [--0] corresponde apenas aos 3 caracteres - , . e 0 .

Observe que em locais diferentes de ASCII, o padrão pode corresponder a um conjunto diferente de caracteres. O efeito da configuração de localidade nos intervalos de caracteres é um pouco variável entre sistemas e aplicações.

A maioria dos mecanismos de expressões regulares usa a mesma sintaxe para intervalos de caracteres como padrões de globos de shell, com duas diferenças:

  • Em um padrão glob, se o primeiro caractere após o colchete de abertura for um ! , o padrão corresponderá a todos os caracteres não no conjunto. Em uma expressão regular, o caractere ^ desempenha o mesmo papel. Alguns shells suportam ^ , bem como ! .
  • Algumas variantes de expressões regulares permitem que \ faça o próximo caractere perder seu significado especial, por exemplo, [\[\]\-a] corresponde a [ , ] , - ou a . Em outras variantes de expressão regular e em padrões glob, uma barra invertida nos conjuntos de caracteres não tem significado especial. Se ] estiver no conjunto, ele deve vir primeiro (é impossível especificar um conjunto vazio: [] é um padrão incompleto, correspondendo a um colchete de fechamento ou a qualquer caractere que venha depois).
por 21.12.2014 / 00:16

Tags