Ich brauche ein internationalisiertes Dienstprogramm, das dasselbe tut wie tr
: holt Zeichen aus dem Stream und ersetzt sie durch ein entsprechendes Zeichen. Keine spezielle Falllösung wie von unten nach oben, sondern eine allgemeine Falllösung ist erforderlich. sed
Wenn möglich ohne Gorillion- Anrufe.
Beachten Sie, dass tr
dies unter Linux nicht funktioniert: Es übersetzt Bytes, keine Zeichen. Dies schlägt bei Multibyte-Codierungen fehl.
$ tr --version | head -n 1
tr (GNU coreutils) 8.23
$ echo $LC_CTYPE
en_US.UTF-8
$ echo 'Ångstrom' | tr Æ Œ
Ņngstrom
tr
in einem UTF-8-Gebietsschema nicht.Antworten:
GNU
sed
arbeitet mit Multi-Byte-Zeichen. Damit:Es ist nicht so sehr, dass GNU
tr
nicht internationalisiert wurde, sondern dass es keine Multi-Byte-Zeichen unterstützt (wie die Nicht-ASCII-Zeichen in UTF-8-Gebietsschemas). GNUtr
würde damit arbeitenÆ
,Œ
solange sie wie im iso8859-15-Zeichensatz Einzelbyte waren.Mehr dazu unter Wie mache ich tr auf Nicht-ASCII (Unicode) -Zeichen aufmerksam?
In jedem Fall hat das nichts mit Linux zu tun, es geht um die
tr
Implementierung auf dem System. Ob dieses System Linux als Kernel verwendet odertr
für Linux erstellt wurde oder die Linux-Kernel-API verwendet, ist nicht relevant, da dieser Teil dertr
Funktionalität im Benutzerbereich stattfindet.Busybox
tr
und GNUtr
sind am häufigsten in Distributionen von Software zu finden, die für Linux entwickelt wurden, und unterstützen keine Multi-Byte-Zeichen. Es gibt jedoch auch andere, die auf Linux portiert wurden, wie dietr
des Erbstück-Toolchests (von OpenSolaris portiert) oder von ast- öffne das zu tun.Beachten Sie, dass
sed
‚sy
nicht Bereiche unterstützt wiea-z
. Beachten Sie außerdem, dass das Skript,sed 'y/é½Æ/ABŒ/'
das im UTF-8-Zeichensatz geschrieben ist, nicht mehr wie erwartet funktioniert, wenn es in einem Gebietsschema aufgerufen wird, in dem UTF-8 nicht der Zeichensatz ist.Eine Alternative könnte sein
perl
:Oben wird erwartet, dass sich der Perl-Code in UTF-8 befindet, aber er verarbeitet die Eingabe in der Codierung des Gebietsschemas (und die Ausgabe in derselben Codierung). Wenn es in einem UTF-8-Gebietsschema aufgerufen wird, wird ein UTF-8
Æ
(0xc3 0x86) in ein UTF-8Œ
(0xc5 0x92) und in einem ISO8859-15-Format, jedoch für 0xc6 -> 0xbc, transliteriert.In den meisten Shells sollte es in Ordnung sein, diese UTF-8-Zeichen in einfachen Anführungszeichen zu haben, auch wenn das Skript in einem Gebietsschema aufgerufen wird, in dem UTF-8 nicht der Zeichensatz ist (eine Ausnahme ist,
yash
die sich beschweren würde, wenn diese Bytes keine gültigen Zeichen bilden im Gebietsschema). Wenn Sie jedoch andere Anführungszeichen als einfache Anführungszeichen verwenden, kann dies zu Problemen führen. Zum Beispiel,würde in einem Gebietsschema fehlschlagen, in dem der Zeichensatz BIG5-HKSCS ist, da die Codierung von
\
(0x5c) auch in einigen anderen Zeichen enthalten ist (wieα
: 0xa3 0x5c, und die UTF-8-Codierung von♣
endet zufällig in 0xa3).Erwarten Sie auf keinen Fall Dinge wie
akute Akzente zu entfernen. Das obige ist eigentlich nur
Das heißt, der Bereich basiert auf den Unicode-Codepunkten. So reicht nicht sein nützlich außerhalb von sehr gut definierten Sequenzen , die in der „geschehen sein Recht wie“ Ordnung in Unicode
A-Z
,0-9
.Wenn Sie akute Akzente entfernen möchten, müssen Sie erweiterte Tools wie Folgendes verwenden:
Verwenden Sie Unicode-Normalisierungsformulare, um Zeichen zu zerlegen, die akuten Akzente (hier das Kombinationsformular
U+0301
) zu entfernen und neu zu komponieren.Ein weiteres nützliches Tool zu transkribieren Unicode ist
uconv
von ICU . Zum Beispiel könnte das Obige auch geschrieben werden als:Würde aber nur mit UTF-8-Daten funktionieren. Sie würden brauchen:
Um Daten im Gebietsschema des Benutzers verarbeiten zu können.
quelle
echo 'été à la plage' | perl -Mopen=locale -MUnicode::Normalize -pe '$_ = NFKD($_); s/\x{301}//g; $_ = NFKC($_)'
Showsete à la plage
, dh das é wurde geändert, aber nicht das à.s/\pM//g
um jede Kombinationsmarke zu entfernen, wenn Sie dies möchten.In Bash können Sie die Parametererweiterung verwenden .
Å
Erfolgreich ersetzen :Der Versuch zu ersetzen
Æ
, der nicht Teil der Zeichenfolge ist:quelle
Es kann Ihr Kodierungsschema sein. Versuchen Sie es wie folgt durch iconv:
Kommt raus mit: Œngstrom
quelle