Der Befehl cutverfügt über eine Option -c, mit der Zeichen anstelle von Bytes bearbeitet werden können -b. Aber das scheint im en_US.UTF-8Gebietsschema 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-4das 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 -cmacht also nicht mehr als das -bfür UTF-8.
Ich würde erwarten, dass das Setup des Gebietsschemas für UTF-8 nicht richtig ist, aber im Vergleich dazu wcwie 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 -bund -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-ceigentlich gedacht ist.