这个tr命令中为什么会出现意外情况?

时间:2012-01-20 14:05:33

标签: bash

我有一个tr命令,应该将特殊字符音译为标准[az] [AZ]字符,因为我正在整理输入,因为我无法接受某些特殊字符的输入,例如ÊÌÐÑÖØÙÜÝßàåæçèîïðõ。 / p>

但是,我的测试输入无法正常工作。

命令

输入为Bío-Bío,在echo命令中。

echo "Bío-Bío" | tr [ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ] [SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy]

实际输出

  

B]] O-B]] O

期望输出

  

比奥比奥

任何人都可以告诉我为什么会这样吗?

EDIT0 : 我检查并确认tr命令中的两个字符串长度相同(69个字符)。

2 个答案:

答案 0 :(得分:3)

两个参数字符串的长度实际上有所不同,因为第一个参数中的字符在UTF-8中以多个字节编码。我将上面的内容复制并粘贴到MacBook上的脚本中,然后在其上运行od -t x2,并获得以下内容:

0000000      6365    6f68    2220    c342    6fad    422d    adc3    226f
0000020      7c20    7420    2072    c55b    c5a0    c592    c5bd    c5a1
0000040      c593    c5be    c2b8    c2a5    c3b5    c380    c381    c382
0000060      c383    c384    c385    c386    c387    c388    c389    c38a
0000100      c38b    c38c    c38d    c38e    c38f    c390    c391    c392
0000120      c393    c394    c395    c396    c398    c399    c39a    c39b
0000140      c39c    c39d    c39f    c3a0    c3a1    c3a2    c3a3    c3a4
0000160      c3a5    c3a6    c3a7    c3a8    c3a9    c3aa    c3ab    c3ac
0000200      c3ad    c3ae    c3af    c3b0    c3b1    c3b2    c3b3    c3b4
0000220      c3b5    c3b6    c3b8    c3b9    c3ba    c3bb    c3bc    c3bd
0000240      5dbf    5b20    4f53    735a    7a6f    5959    4175    4141
0000260      4141    4141    4543    4545    4945    4949    4449    4f4e
0000300      4f4f    4f4f    554f    5555    5955    6173    6161    6161
0000320      6161    6563    6565    6965    6969    6f69    6f6e    6f6f
0000340      6f6f    756f    7575    7975    5d79    000a                

查看所有0xc3个字节?这些是以16位表示的UTF-8字符的高位字节。

至于如何修复:不确定。我想知道使用三位八进制转义符(\ nnn)来表示奇怪的字符会有所帮助。

答案 1 :(得分:3)

tr命令无法理解UTF8。

使用iconv可能会有更好的运气:

echo "Bío-Bío" | iconv -f utf8 -t ascii//translit