Dizendo 'tr' que a-z não é apenas ASCII

1
tr -sc 'A-Za-z' '2'

é o que eu preciso, mas não inclui todas as letras. Como você pode fazer isso funcionar para idiomas como o francês? Como você pode dizer 'tr' que entre 'a-z' deve haver também 'à', 'é' e 'ç'?

    
por Quora Feans 03.11.2014 / 20:54

1 resposta

4

Em princípio:

  • Defina a variável de localidade LC_CTYPE para aquela que descreve seu conjunto de caracteres e codificação desejados, por exemplo, LC_CTYPE=fr_FR.UTF-8 .
  • Use [:alpha:] para representar todas as letras, pois os intervalos de caracteres não são bem definidos em locais que vão além do ASCII (eles dependem da implementação e do aplicativo) e A-Za-z não enumera todas as letras mesmo em localidades onde os intervalos são baseados em números de pontos de código (falta as letras anteriores a A ou depois de Z , das quais o francês não possui, mas outras linguagens: Å em sueco, Ž em tcheco,…) .

Assim,

tr -sc '[:alpha:]' '2'

No entanto, muitas implementações de tr , incluindo a do GNU Coreutils, não suportam codificações multibyte. Por exemplo, o comando acima funciona em uma codificação Latin-1, mas não em UTF-8. Você pode usar sed em vez disso.

sed 's/[^[:alpha:]][^[:alpha:]]*/_/g'
    
por 04.11.2014 / 01:07

Tags