无法理解 xargs 如何处理 unicode 文字

无法理解 xargs 如何处理 unicode 文字

我正在尝试将 unicode 文字转换为可读格式。我使用 -t 标志来查看 xargs 在运行之前将运行什么命令。我看到以下奇怪之处:

$ echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
echo -e "\t\u0042\u0065\u006e"
"       \u0042\u0065\u006e"

然而,当我手动运行它时:

$ echo -e "\t\u0042\u0065\u006e"
        Ben
$

\t在这两个示例中都得到了正确的处理。但\u00XX在第一个示例中,这些值被视为纯字符串,但在第二个示例中被正确编码。当我使用时,我printf也看到同样的奇怪现象。


$echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' printf \"{}\"
printf "\t\u0042\u0065\u006e"
"       printf: invalid universal character name \u0042
$ printf "\t\u0042\u0065\u006e"
        Ben

关于发生的事情以及如何解决它有什么想法吗?

答案1

Dave 是正确的,不涉及 shell,所以 echo 是 /bin/echo,试试这个:


echo  "\\\t\\\u0042\\\u0065\\\u006e" | od -c

echo "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
 
# echo -e '"'\t\u0042\u0065\u006e'"'
/bin/echo -e '"'\\t\\u0042\\u0065\\u006e'"'

结果:

0000000   \   \   t   \   \   u   0   0   4   2   \   \   u   0   0   6
0000020   5   \   \   u   0   0   6   e  \n
0000031
"   \u0042\u0065\u006e"
"   \u0042\u0065\u006e"
echo -e "\t\u0042\u0065\u006e" 

尝试过在线 bash shell

相关内容