Verifique se o texto contém caracteres não-ASCII em um script de shell

3

Eu tenho um arquivo, quero determinar se ele contém apenas caracteres ASCII em inglês.

Eu pensei que esta é uma pergunta muito comum, mas quando eu pesquisei, não há uma resposta direta ou relacionada.

De acordo com algumas outras perguntas, isso é o que eu tenho até agora, mas isso não funciona. Não importa caracteres ASCII ou Não-ASCII, ele sempre será determinado como não-ascii.

if (LC_ALL=C; [[ $TEXT = *[[:ascii:]]* ]]) then
  echo "Contain Non-ASCII"
fi

BTW, este é um script de shell.

    
por SnowWolf 05.04.2015 / 03:53

3 respostas

5

Seu código testa se o valor da variável TEXT contém pelo menos um caractere ASCII. Se você quiser testar se $TEXT contém caracteres não-ASCII, será necessário inverter o conjunto. A propósito, [:ascii:] é independente de localidade, portanto, você não precisa definir LC_CTYPE .

if [[ $TEXT = *[![:ascii:]]* ]]; then
  echo "Contain Non-ASCII"
fi

Observe que [:ascii:] é um recurso bash (e zsh). Se você quiser que seu script funcione no ksh ou no sh simples, será necessário usar o código do idioma. Aqui está um método portátil:

LC_CTYPE=C
case $TEXT in
  *[![:cntrl:][:print:]]*) echo "Contain Non-ASCII";;
esac

Se você quiser verificar o conteúdo do arquivo, use grep .

if LC_ALL=C grep -q '[![:cntrl:][:print:]]' somefile; then
  echo "Contain Non-ASCII"
fi
    
por 06.04.2015 / 01:37
1

O comando file pode informar o tipo de um arquivo (ASCII, unicode, binário, etc.).

$ file my_file.txt
my_file.txt: ASCII text

Você pode verificar se a saída contém a palavra "ASCII" e isso deve funcionar:

if [[ file my_file.txt | grep -i ascii ]] ...
    
por 17.01.2016 / 02:18
-1
TEXT=SOMETEXTHERE

RESULT=$(echo $TEXT | LC_COLLATE=C grep -r '[^ -~]')
if [ -z "$RESULT" ]; then
    echo "ALL ASCII"
else
    echo "Contain Non-ASCII"
fi
    
por 05.04.2015 / 05:18