该命令cut
具有一个-c
处理字符的选项,而不是带有选项的字节-b
。但这似乎在en_US.UTF-8
区域设置中不起作用:
第二个字节给出第二个ASCII字符(在UTF-8中编码相同):
$ printf 'ABC' | cut -b 2
B
但不会在UTF-8语言环境中给出三个希腊非ASCII字符中的第二个:
$ printf 'αβγ' | cut -b 2
�
没关系-这是第二个字节。
因此,我们改为看第二个字符:
$ printf 'αβγ' | cut -c 2
�
看起来坏了。
通过一些实验,结果表明范围3-4
显示了第二个字符:
$ printf 'αβγ' | cut -c 3-4
β
但这与字节3到4相同:
$ printf 'αβγ' | cut -b 3-4
β
因此,对于UTF-8,-c
最多不会超过-b
。
我希望语言环境设置不适用于UTF-8,但是相比之下,它wc
可以按预期工作;
它通常用于带有选项-c
(--bytes
)的字节计数。
(请注意令人困惑的选项名称。)
$ printf 'αβγ' | wc -c
6
但是它也可以使用选项-m
(--chars
)来计算字符,该选项才有效:
$ printf 'αβγ' | wc -m
3
因此,我的配置似乎还可以-但有些特殊之处cut
。
也许它根本不支持UTF-8?但是它似乎支持多字节字符,否则就不需要支持-b
和-c
。
那怎么了 又为什么呢
据我所知,utf8的语言环境设置正确无误:
$ 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=
输入,逐字节:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
正在使用与相同的代码-b
。您看过源代码了吗?也许您可以找到一个提示,这-c
实际上意味着什么。