Esa es una limitación conocida ( 1 , 2 , 3 , 4 , 5 , 6 ) de la implementación de GNU de tr
.
No es tanto que no sea compatible con caracteres extranjeros , no ingleses o no ASCII, sino que no sea compatible con caracteres de varios bytes.
Esos caracteres cirílicos se tratarían bien, si se escriben en el conjunto de caracteres iso8859-5 (un byte por carácter) (y su localidad estaba usando ese juego de caracteres), pero su problema es que está usando UTF-8 donde no es ASCII Los caracteres están codificados en 2 o más bytes.
GNU tiene un plan (ver también ) para arreglar eso y el trabajo está en marcha pero aún no existe.
FreeBSD o Solaris tr
no tienen el problema.
Mientras tanto, para la mayoría de los casos de uso tr
, puede usar GNU sed o GNU awk que admiten caracteres de varios bytes.
Por ejemplo, su:
tr -cs '[[:alpha:][:space:]]' ' '
podría escribirse:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
o:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
Para convertir entre minúsculas y mayúsculas ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
(eso l
es minúscula L
, no el 1
dígito).
o:
gawk '{print tolower($0)}'
Para la portabilidad, perl
es otra alternativa:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
Si sabe que los datos se pueden representar en un conjunto de caracteres de un solo byte, puede procesarlos en ese conjunto de caracteres:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8