La commande cut
a une option -c
pour travailler sur des caractères, au lieu d'octets avec l'option -b
. Mais cela ne semble pas fonctionner, en en_US.UTF-8
locale:
Le deuxième octet donne le deuxième caractère ASCII (qui est codé de la même manière en UTF-8):
$ printf 'ABC' | cut -b 2
B
mais ne donne pas le deuxième des trois caractères grecs non ASCII dans les paramètres régionaux UTF-8:
$ printf 'αβγ' | cut -b 2
�
C'est bien - c'est le deuxième octet .
Nous regardons donc le deuxième caractère à la place:
$ printf 'αβγ' | cut -c 2
�
Ça a l'air cassé.
Avec quelques expériences, il s'avère que la plage 3-4
montre le deuxième caractère:
$ printf 'αβγ' | cut -c 3-4
β
Mais c'est exactement la même chose que les octets 3 à 4:
$ printf 'αβγ' | cut -b 3-4
β
Donc, -c
ne fait pas plus que -b
pour UTF-8.
Je m'attendrais à ce que la configuration locale ne soit pas correcte pour UTF-8, mais en comparaison, wc
fonctionne comme prévu;
Il est souvent utilisé pour compter les octets, avec l'option -c
( --bytes
).
(Notez les noms d'options confus.)
$ printf 'αβγ' | wc -c
6
Mais il peut également compter les caractères avec l'option -m
( --chars
), qui fonctionne simplement:
$ printf 'αβγ' | wc -m
3
Ma configuration semble donc correcte - mais quelque chose de spécial cut
.
Peut-être qu'il ne prend pas du tout en charge l'UTF-8? Mais il semble prendre en charge les caractères multi-octets, sinon il n'aurait pas besoin de prendre en charge -b
et -c
.
Alors, qu'est-ce qui ne va pas? Et pourquoi?
La configuration locale semble correcte pour utf8, pour autant que je sache:
$ 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=
L'entrée, octet par octet:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
utiliser le même code que-b
. Avez-vous regardé le code source? Vous pouvez peut-être trouver un indice de ce à quoi il-c
est réellement destiné.