El comando cut
tiene una opción -c
para trabajar en caracteres, en lugar de bytes con la opción -b
. Pero eso no parece funcionar, en la en_US.UTF-8
configuración regional:
El segundo byte proporciona el segundo carácter ASCII (que está codificado de la misma manera en UTF-8):
$ printf 'ABC' | cut -b 2
B
pero no da el segundo de tres caracteres griegos no ASCII en la configuración regional UTF-8:
$ printf 'αβγ' | cut -b 2
�
Está bien, es el segundo byte .
Entonces miramos el segundo personaje en su lugar:
$ printf 'αβγ' | cut -c 2
�
Eso se ve roto.
Con algunos experimentos, resulta que el rango 3-4
muestra el segundo personaje:
$ printf 'αβγ' | cut -c 3-4
β
Pero eso es lo mismo que los bytes 3 a 4:
$ printf 'αβγ' | cut -b 3-4
β
Entonces el -c
no hace más que el -b
UTF-8.
Esperaría que la configuración regional no sea adecuada para UTF-8, pero en comparación, wc
funciona como se esperaba;
A menudo se usa para contar bytes, con la opción -c
( --bytes
).
(Tenga en cuenta los nombres confusos de las opciones).
$ printf 'αβγ' | wc -c
6
Pero también puede contar caracteres con la opción -m
( --chars
), que simplemente funciona:
$ printf 'αβγ' | wc -m
3
Así que mi configuración parece estar bien, pero hay algo especial en esto cut
.
Tal vez no es compatible con UTF-8 en absoluto? Pero parece admitir caracteres de varios bytes, de lo contrario no necesitaría admitir -b
y -c
.
¿Así que qué hay de malo? ¿Y por qué?
La configuración regional parece correcta para utf8, por lo que puedo decir:
$ 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=
La entrada, byte por byte:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
está usando el mismo código que-b
. ¿Le echó un vistazo al código fuente? Tal vez puedas encontrar una pista de lo-c
que realmente está destinado.