오늘 사용할 때 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=
cut
이때는 안되는 경우가 있어요
echo 哈哈 | cut -c 2-
��哈
올바른 출력은 다음과 같아야합니다
哈
cut -c
멀티바이트 문자를 사용하는 경우 .
답변1
GNU coreutils는 일반적으로 UTF-8을 이해합니다. 예를 들어 UTF-8 로케일의 올바른 출력입니다 echo 哈哈 | wc -m
(이 옵션은 기록상의 이유로 바이트가 아니라 바이트를 의미함).3
-m
-c
이것은 의 버그입니다 cut
. 보고 있다원천cut
, cut
on 문자는 전혀 구현되지 않습니다. -c
옵션은 의 동의어로 처리됩니다 -b
.
해결책은 awk를 사용하는 것입니다. GNU awk는 UTF-8을 매우 잘 처리합니다.
awk '{print substr($0,2,length)}'
답변2
이것은 귀하의 빌드/버전에 버그가 있는 것 같습니다 coreutils
. Ubuntu 10.10 Maverick Meerkat에서는 이것을 재현할 수 있지만 Fedora 15에서는 재현할 수 없습니다.
[patches@holocene ~]$ cat /etc/fedora-release Fedora 버전 15(Lovelock) [patches@holocene ~]$ rpm -q coreutils coreutils-8.10-2.fc15.x86_64 [patches@holocene ~]$ echo 하하|cut -c 2- 하아 [patches@holocene ~]$ sudo chroot /mnt/maverick root@holocene:/# grep DISTRIB_DESC /etc/lsb-release DISTRIB_DESCRIPTION="우분투 10.10" root@holocene:/# dpkg-query -s coreutils |버전 번호 버전: 8.5-1ubuntu3 root@holocene:/# echo haha|cut -c 2- ��하
coreutils
Ubuntu도 사용하는 경우 다음 명령을 실행하여 Ubuntu 패키저에 오류를 보고할 수 있습니다.
apport-bug coreutils
고쳐 쓰다: Gilles는 댓글에서 이것이 coreutils
패치된 Fedora 업스트림 버전의 버그라고 지적했습니다. 여기서 패치를 찾을 수 있습니다.직접 패치하여 작동시키려는 경우.