Der Befehl cut
verfügt über eine Option -c
, mit der Zeichen anstelle von Bytes bearbeitet werden können -b
. Aber das scheint im en_US.UTF-8
Gebietsschema nicht zu funktionieren :
Das zweite Byte gibt das zweite ASCII-Zeichen an (das in UTF-8 genauso codiert ist):
$ printf 'ABC' | cut -b 2
B
gibt aber nicht das zweite von drei griechischen Nicht-ASCII-Zeichen im UTF-8-Gebietsschema an:
$ printf 'αβγ' | cut -b 2
�
Das ist in Ordnung - es ist das zweite Byte .
Also schauen wir uns stattdessen das zweite Zeichen an:
$ printf 'αβγ' | cut -c 2
�
Das sieht kaputt aus.
Bei einigen Experimenten hat sich herausgestellt, dass der Bereich 3-4
das zweite Zeichen zeigt:
$ printf 'αβγ' | cut -c 3-4
β
Das ist aber genauso wie bei den Bytes 3 bis 4:
$ printf 'αβγ' | cut -b 3-4
β
Das -c
macht also nicht mehr als das -b
für UTF-8.
Ich würde erwarten, dass das Setup des Gebietsschemas für UTF-8 nicht richtig ist, aber im Vergleich dazu wc
wie erwartet funktioniert.
Es wird häufig zum Zählen von Bytes mit der Option -c
( --bytes
) verwendet.
(Beachten Sie die verwirrenden Optionsnamen.)
$ printf 'αβγ' | wc -c
6
Es können aber auch Zeichen mit option -m
( --chars
) gezählt werden, was einfach funktioniert:
$ printf 'αβγ' | wc -m
3
Meine Konfiguration scheint also in Ordnung zu sein - aber etwas Besonderes ist daran cut
.
Vielleicht unterstützt es UTF-8 überhaupt nicht? Aber es scheint , Multi-Byte - Zeichen zu unterstützen, sonst wäre es muß nicht unterstützen -b
und -c
.
Also, was ist falsch? Und warum?
Das Setup des Gebietsschemas sieht für utf8 richtig aus, soweit ich das beurteilen kann:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Die Eingabe, byteweise:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
, als würde derselbe Code verwendet wie-b
. Hast du dir den Quellcode angesehen? Vielleicht findest du einen Hinweis, wofür-c
eigentlich gedacht ist.