Itu yang diketahui ( 1 , 2 , 3 , 4 , 5 , 6 ) batasan implementasi GNU tr.
Ini tidak sebanyak itu tidak mendukung karakter asing , non-Inggris atau non-ASCII, tetapi tidak mendukung karakter multi-byte.
Karakter Cyrillic tersebut akan diperlakukan OK, jika ditulis dalam rangkaian karakter iso8859-5 (byte tunggal per karakter) (dan lokal Anda menggunakan charset itu), tetapi masalahnya adalah Anda menggunakan UTF-8 di mana bukan ASCII karakter dikodekan dalam 2 atau lebih byte.
GNU punya rencana (lihat juga ) untuk memperbaikinya dan pekerjaan sedang berjalan tetapi belum ada di sana.
FreeBSD atau Solaris trtidak memiliki masalah.
Sementara itu, untuk sebagian besar kasus penggunaan tr, Anda dapat menggunakan GNU sed atau GNU awk yang mendukung karakter multi-byte.
Misalnya, Anda:
tr -cs '[[:alpha:][:space:]]' ' '
dapat ditulis:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
atau:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
Untuk mengonversi antara huruf kecil dan huruf besar ( tr '[:upper:]' '[:lower:]'):
gsed 's/[[:upper:]]/\l&/g'
(itu lhuruf kecil L, bukan 1digit).
atau:
gawk '{print tolower($0)}'
Untuk portabilitas, perladalah alternatif lain:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
Jika Anda tahu data dapat direpresentasikan dalam set karakter byte tunggal, maka Anda dapat memprosesnya dalam rangkaian karakter itu:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8