Essa é uma limitação conhecida ( 1 , 2 , 3 , 4 , 5 , 6 ) da implementação GNU de tr
.
Não é tanto o fato de não suportar caracteres estrangeiros , não ingleses ou não ASCII, mas não suporta caracteres de vários bytes.
Esses caracteres cirílicos seriam tratados como OK, se escritos no conjunto de caracteres iso8859-5 (byte único por caractere) (e seu código do idioma usasse esse conjunto de caracteres), mas o seu problema é que você está usando UTF-8 onde não ASCII caracteres são codificados em 2 ou mais bytes.
O GNU tem um plano (veja também ) para consertar isso e o trabalho está em andamento, mas ainda não existe.
FreeBSD ou Solaris tr
não têm o problema.
Enquanto isso, na maioria dos casos de uso tr
, você pode usar o GNU sed ou o GNU awk que suportam caracteres de vários bytes.
Por exemplo, seu:
tr -cs '[[:alpha:][:space:]]' ' '
poderia ser escrito:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
ou:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
Para converter entre maiúsculas e minúsculas ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
(ou l
seja L
, minúsculas , não o 1
dígito).
ou:
gawk '{print tolower($0)}'
Para portabilidade, perl
é outra alternativa:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
Se você souber que os dados podem ser representados em um conjunto de caracteres de byte único, poderá processá-los nesse conjunto de caracteres:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8