Cha*_* Xu 18 coreutils cut unicode
我cut
今天用的时候发现它不把一个UTF-8字符当作一个字符,而是把3个字符当作一个字符来对待,因为它有3个字节长。
对于许多工具来说,这似乎通常是正确的。
是否有支持coreutils
UTF-8 的版本?
我的locale
输出:
LANG=en_US.UTF-8
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=
Run Code Online (Sandbox Code Playgroud)
这是cut
不起作用的时候
echo ?? | cut -c 2-
???
Run Code Online (Sandbox Code Playgroud)
正确的输出应该是
?
Run Code Online (Sandbox Code Playgroud)
如果cut -c
使用多字节字符。
Gil*_*il' 16
GNU coreutils 确实理解 UTF-8。例如echo ?? | wc -m
,3
在 UTF-8 语言环境中正确输出(请注意,该选项是-m
,而不是-c
由于历史原因,这意味着字节)。
这是cut
. 查看, on characters的来源cut
cut
根本没有实现:该-c
选项被视为 的同义词-b
。
一种解决方法是使用 awk。GNU awk 可以很好地处理 UTF-8。
awk '{print substr($0,2,length)}'
Run Code Online (Sandbox Code Playgroud)