Đó là một hạn chế đã biết ( 1 , 2 , 3 , 4 , 5 , 6 ) của việc triển khai GNU tr
.
Nó không nhiều đến mức nó không hỗ trợ các ký tự nước ngoài , không phải tiếng Anh hoặc không phải ASCII, nhưng nó không hỗ trợ các ký tự nhiều byte.
Các ký tự Cyrillic đó sẽ được xử lý OK, nếu được viết trong bộ ký tự iso8859-5 (một byte cho mỗi ký tự) (và ngôn ngữ của bạn đang sử dụng bộ ký tự đó), nhưng vấn đề của bạn là bạn đang sử dụng UTF-8 trong đó không phải ASCII các ký tự được mã hóa từ 2 byte trở lên.
GNU có một kế hoạch (xem thêm ) để khắc phục điều đó và công việc đang được tiến hành nhưng chưa có.
FreeBSD hoặc Solaris tr
không có vấn đề.
Trong thời gian trung bình, đối với hầu hết các trường hợp sử dụng tr
, bạn có thể sử dụng GNU sed hoặc GNU awk hỗ trợ các ký tự nhiều byte.
Chẳng hạn, của bạn:
tr -cs '[[:alpha:][:space:]]' ' '
có thể được viết:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
hoặc là:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
Để chuyển đổi giữa chữ thường và chữ hoa ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
(đó l
là chữ thường L
, không phải 1
chữ số).
hoặc là:
gawk '{print tolower($0)}'
Đối với tính di động, perl
là một thay thế khác:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
Nếu bạn biết dữ liệu có thể được biểu diễn trong một bộ ký tự một byte, thì bạn có thể xử lý nó trong bộ ký tự đó:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8