我对此感到惊讶:
$ echo "§" | tr '§' 'a'
aa
我期望有一个a
。
这是为什么?
答案 0 :(得分:2)
tr
(至少是GNU实现)不能正确处理多字节字符。查看此答案https://unix.stackexchange.com/a/228570/330217
显然,§
在您的语言环境中是一个两个字节的字符,因此'§'
的第一组字符包含两个字节。第二组'a'
扩展到第一组的长度,因此有效地执行了命令
tr '§' 'a'
表现像
tr '<1st byte of §><2nd byte of §>' 'aa'
类似于
echo foobar | tr 'abc' 'x'
作为一种解决方法,您可以使用sed
代替tr
。
$ echo "§"|sed 's/§/a/g'
a