Bash中等效于Python的字符串字面量进行utf字符串转换
我正在写一个bash脚本,需要处理包含特殊字符的html,比如@!'ó
。目前我的脚本已经运行了,但它对这些特殊字符要么不理会,要么出错,因为服务器返回这些字符时是以十进制unicode的形式,比如'
。我已经找到了如何解析这些字符并转换成十六进制,然后加载到python中再转换回它们的符号。我想知道bash是否可以直接完成这个最后的转换。以下是一个在python中的简单示例:
print ur"\u0032" ur"\u0033" ur"\u0040"
输出结果是
23@
我能在Bash中实现同样的结果吗?我查过iconv,但我觉得它可能无法满足我的需求,或者更可能的是我不知道怎么用。
这里有一些相关的信息:
以下是一些预期的输入输出示例。
Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch
Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch
АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)
АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)
2 个回答
可能的解决方案,比如:
$ function conv() { echo $* | python -c 'import re, sys; print re.sub(r"&#(\d+);", lambda x: unichr(int(x.group(1))), sys.stdin.read()).rstrip()' ; }
$ conv 'АлисА (Alisa)'
АлисА (Alisa)
Bash里的printf
这个内置命令不支持Unicode编码,但在我的GNU系统上,外部的printf
是支持的:
$ /usr/bin/printf "\u0410\u043b\u0438\u0441\u0410"
АлисА
或者这样做,可以从你的路径中选择printf
,以防它不在/usr/bin
目录下:
$ $(type -P printf) "\u0410\u043b\u0438\u0441\u0410"
АлисА
或者
$ env printf "\u0410\u043b\u0438\u0441\u0410"
АлисА