Especificando o intervalo completo de caracteres ASCII imprimíveis em um padrão glob

2

Eu quero usar um padrão globbing para corresponder apenas caracteres ASCII imprimíveis (incluindo espaço) 0x20 a 0x7e . Isso está sendo usado em um super super.tab banco de dados.

Cheguei ao padrão:

[[ -~]]

Isso parece funcionar e de fato restringe que caracteres não imprimíveis sejam transmitidos como argumentos.

Já analisei alguma coisa, ou esta é a maneira correta de especificar esse intervalo de caracteres?

Editar:

Com base na sugestão do mikeserv para usar [[:print:]] , eu tentei e parece que não funciona.

Veja como é a entrada no meu super.tab :

dosuperthing  /system/dosuperthing.pl $Users  uid=0 arg1="[[:print:]]"

Se eu tentar [[:print:]] , [:print:] ou :print: como padrões de globbing para arg1 , isso resultará em (respectivamente) o seguinte sendo registrado por super onde eu passo abcdef como meu primeiro argumento:

super: (admin) Your argument #1 <abcdef> must match pattern <[[:print:]]>

super: (admin) Your argument #1 <abcdef> must match pattern <[:print:]>

super: (admin) Your argument #1 <abcdef> must match pattern <:print:>

Este é o antigo código de produção legado e não consigo mexer nele além de ajustar os padrões arg1-99 aceitáveis dentro de super.tab .

    
por Kev 07.04.2014 / 06:46

1 resposta

2

O padrão global ou expressão regular [ -~] corresponde a todos os caracteres imprimíveis no código do idioma C: corresponde a todos os caracteres de 32 (espaço) a 126 (til). Em uma localidade diferente de C (mais precisamente, se LC_COLLATE não for C), se o aplicativo tiver reconhecimento de local, isso poderá corresponder a outros caracteres.

Outra maneira de escrever esse padrão é [[:print:]] . No entanto, isso corresponde a todos os caracteres imprimíveis na localidade atual (com base na configuração LC_CTYPE ), portanto, não é melhor que [ -~] para seu caso de uso. Além disso, pode não funcionar se o aplicativo ou a biblioteca do sistema for muito antiquado para entender a sintaxe [:class:] .

A sintaxe [[cHARS]] do Super (se a opção global patterns=shell estiver definida) segue o mesmo princípio, por isso é [[ -~]] para significar apenas "caracteres ASCII imprimíveis". Super não define nenhuma localidade diferente de LC_CTYPE , então você está seguro disso. Certifique-se de que patterns=shell seja definido; o padrão é patterns=regex , que exige que você escreva ^[ -~]*$ .

    
por 07.04.2014 / 23:07