<Anterior | Conteúdo | Próxima>
Classes de caracteres POSIX
Os intervalos de caracteres tradicionais são uma forma eficaz e de fácil compreensão de lidar com o problema de especificar conjuntos de caracteres rapidamente. Infelizmente, eles nem sempre funcionam. Embora não tenhamos encontrado nenhum problema com o uso de grep até agora, podemos ter problemas ao usar outros programas.
De volta ao Capítulo 4, vimos como os curingas são usados para realizar a expansão do nome do caminho. Nessa discussão, dissemos que os intervalos de caracteres podem ser usados de maneira quase idêntica à forma como são usados em expressões regulares, mas aqui está o problema:
[me @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[me @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
(Dependendo da distribuição do Linux, obteremos uma lista diferente de arquivos, possivelmente uma lista vazia. Este exemplo é do Ubuntu). Este comando produz o resultado esperado - uma lista apenas dos arquivos cujos nomes começam com uma letra maiúscula, mas:
[me @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / reclamar
/ usr / sbin / console-kit-daemon
[me @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / reclamar
/ usr / sbin / console-kit-daemon
com este comando obtemos um resultado totalmente diferente (apenas uma lista parcial dos resultados é mostrada). Por que é que? É uma longa história, mas aqui está a versão curta:
Na época em que o Unix foi desenvolvido, ele só conhecia caracteres ASCII, e esse recurso reflete esse fato. Em ASCII, os primeiros 32 caracteres (números de 0 a 31) são códigos de controle (coisas como tabulações, retrocessos e retornos de carro). Os próximos 32 (32-63) contêm caracteres imprimíveis, incluindo a maioria dos caracteres de pontuação e os numerais de zero a nove. Os próximos 32 (números 64-95) contêm as letras maiúsculas e mais alguns símbolos de pontuação. O 31 final (números 96-127) contém as letras minúsculas e ainda mais símbolos de pontuação. Com base neste arranjo, os sistemas que usam ASCII usaram um ordem de agrupamento que parecia com isto:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Isso difere da ordem de dicionário adequada, que é assim: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqXyRsStTuUvWx
À medida que a popularidade do Unix se espalhou para além dos Estados Unidos, cresceu a necessidade de oferecer suporte a caracteres não encontrados no inglês dos Estados Unidos. A tabela ASCII foi expandida para usar oito bits completos, adicionando os caracteres de número 128-255, que acomodavam muitos outros idiomas. Para oferecer suporte a essa capacidade, os padrões POSIX introduziram um conceito chamado de local, que pode ser ajustado para selecionar o conjunto de caracteres necessário para um determinado local. Podemos ver a configuração de idioma do nosso sistema usando este comando:
[me @ linuxbox ~] $ echo $ LANG
pt_US.UTF-8
[me @ linuxbox ~] $ echo $ LANG
pt_US.UTF-8
Com essa configuração, os aplicativos compatíveis com POSIX usarão uma ordem de agrupamento de dicionário em vez de uma ordem ASCII. Isso explica o comportamento dos comandos acima. Uma gama de caracteres de [AZ] quando interpretado na ordem do dicionário inclui todos os caracteres alfabéticos exceto a minúscula “a”, daí nossos resultados.
Para contornar parcialmente esse problema, o padrão POSIX inclui várias classes de caracteres que fornecem intervalos úteis de caracteres. Eles são descritos na tabela be-
baixo:
Tabela 19-2: Classes de caracteres POSIX
Descrição da classe de personagem
Descrição da classe de personagem
[: alnum:] Os caracteres alfanuméricos. Em ASCII, equivalente a:
[A-Za-z0-9]
[:palavra:] O mesmo que [: alnum:], com a adição do sublinhado (_) personagem.
[: alfa:] Os caracteres alfabéticos. Em ASCII, equivalente a:
[A-Za-z]
[: em branco:] Inclui os caracteres de espaço e tabulação.
[: cntrl:] Os códigos de controle ASCII. Inclui os caracteres ASCII de 0 a 31 e 127.
[: dígito:] Os numerais de zero a nove.
[: gráfico:] Os caracteres visíveis. Em ASCII, inclui caracteres 33
através do 126.
[: inferior:] As letras minúsculas.
[: punct:] Os caracteres de pontuação. Em ASCII, equivalente a:
[-! "# $% & '() * +,. / :; <=>? @ [\\\] _` {|} ~]
[: imprimir:] Os caracteres imprimíveis. Todos os personagens em [:gráfico:]
mais o caractere de espaço.
[: espaço:] Os caracteres de espaço em branco, incluindo espaço, tabulação, carro
retorno, nova linha, guia vertical e alimentação de formulário. Em ASCII, equivalente a:
[\ t \ r \ n \ v \ f]
[: maiúsculas:] Os caracteres maiúsculos.
[: xdigit:] Caracteres usados para expressar números hexadecimais. Em ASCII, equivalente a:
[0-9A-Fa-f]
Mesmo com as classes de caracteres, ainda não há uma maneira conveniente de expressar intervalos parciais, como [AM].
Usando classes de caracteres, podemos repetir nossa lista de diretórios e ver um resultado melhorado:
[me @ linuxbox ~] $ ls / usr / sbin / [[: superior:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[me @ linuxbox ~] $ ls / usr / sbin / [[: superior:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
Lembre-se, entretanto, de que este não é um exemplo de expressão regular, mas sim o shell que executa a expansão do nome do caminho. Mostramos isso aqui porque as classes de caracteres POSIX podem ser usadas para ambos.
Revertendo para a ordem de agrupamento tradicional
Você pode optar por fazer com que seu sistema use a ordem de agrupamento tradicional (ASCII) alterando o valor do GRANDE variável de ambiente. Como vimos acima, o GRANDE variável contém o nome do idioma e conjunto de caracteres usados em sua localidade. Este valor foi determinado originalmente quando você selecionou um idioma de instalação como seu Linux foi instalado.
Para ver as configurações de localidade, use o local comando:
[me @ linuxbox ~] $ local LANG = en_US.UTF-8 LC_CTYPE = "en_US.UTF-8" LC_NUMERIC = "en_US.UTF-8" LC_TIME = "en_US.UTF-8" LC_COLLATE = "en_US.UTF-8" LC_MONETARY = "en_US.UTF- 8 "LC_MESSAGES =" en_US.UTF-8 "LC_PAPER =" en_US.UTF-8 "LC_NAME =" en_US.UTF-8 "LC_ADDRESS =" en_US.UTF-8 "LC_TELEPHONE =" en_US.UTF-8 "LC_MEASUREMENT =" en_US.UTF-8 "LC_IDENTIFICATION =" en_US.UTF-8 "LC_ALL =
Para alterar a localidade para usar os comportamentos tradicionais do Unix, defina o GRANDE variável para POSIX:
[me @ linuxbox ~] $ export LANG = POSIX
Observe que essa alteração converte o sistema para usar o inglês dos Estados Unidos (mais especificamente, ASCII) para seu conjunto de caracteres, portanto, certifique-se de que isso seja realmente o que você deseja.
Você pode tornar esta mudança permanente adicionando esta linha a você .bashrc
arquivo:
export LANG = POSIX