Das ist eine bekannte ( 1 , 2 , 3 , 4 , 5 , 6 ) Einschränkung der GNU-Implementierung von tr
.
Es ist nicht so sehr so, dass es keine Fremd- , Nicht-Englisch- oder Nicht-ASCII-Zeichen unterstützt, aber dass es keine Mehrbyte-Zeichen unterstützt.
Diese kyrillischen Zeichen werden in Ordnung behandelt, wenn sie im Zeichensatz iso8859-5 (Einzelbyte pro Zeichen) geschrieben sind (und Ihr Gebietsschema diesen Zeichensatz verwendet hat). Ihr Problem ist jedoch, dass Sie UTF-8 verwenden, wenn es sich nicht um ASCII handelt Zeichen werden in 2 oder mehr Bytes codiert.
GNU hat einen Plan (siehe auch ), um das zu beheben und die Arbeit ist im Gange, aber noch nicht da.
FreeBSD oder Solaris tr
haben das Problem nicht.
In der Zwischenzeit können Sie für die meisten Anwendungsfälle von tr
GNU sed oder GNU awk verwenden, die Multibyte-Zeichen unterstützen.
Zum Beispiel Ihr:
tr -cs '[[:alpha:][:space:]]' ' '
könnte geschrieben werden:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
oder:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
So konvertieren Sie zwischen Groß- und Kleinschreibung ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
(das l
ist ein Kleinbuchstabe L
, nicht die 1
Ziffer).
oder:
gawk '{print tolower($0)}'
Für die Portabilität perl
ist eine andere Alternative:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
Wenn Sie wissen, dass die Daten in einem Einzelbyte-Zeichensatz dargestellt werden können, können Sie sie in diesem Zeichensatz verarbeiten:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8