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 tr
tidak 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 l
huruf kecil L
, bukan 1
digit).
atau:
gawk '{print tolower($0)}'
Untuk portabilitas, perl
adalah 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