tr的意外输出

时间:2019-03-21 07:43:53

标签: linux command-line

我对此感到惊讶:

$ echo "§" | tr '§' 'a'
aa

我期望有一个a

这是为什么?

1 个答案:

答案 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