bash-使用sed替换带有unicode字符的数字

时间:2014-11-26 02:33:56

标签: bash unicode sed printf

所以我从printf

生成了这个输出
    011010

现在我想管它并使用sed用unicode字符替换0和1,所以我打印的是unicode字符而不是二进制(011010)。

我可以这样做只是复制粘贴字符本身,但我想使用值,而不是像在unicode表中找到的那样:

    Position: 0x2701
    Decimal: 9985
    Symbol: ✁

如何将上述值与sed一起使用来生成角色?

1 个答案:

答案 0 :(得分:6)

使用bash(自v4.2起)或zsh,简单的解决方案是使用$'...'语法,该语法理解包含\u转义符的C转义:

$ echo 011010 | sed $'s/1/\u2701/g'
0✁✁0✁0

如果您有Gnu sed,则可以在s//命令中使用转义序列。遗憾的是,Gnu sed不理解\u unicode转义,但它确实理解\x十六进制转义。但是,要让它解码它们,您需要确保它看到反斜杠。然后你可以用UTF-8进行翻译,假设你知道对应于Unicode代码点的UTF-8序列:

$ # Quote the argument
$ echo 011010 | sed 's/1/\xE2\x9C\x81/g'
0✁✁0✁0
$ # Or escape the backslashes
$ echo 011010 | sed s/1/\\xE2\\x9C\\x81/g
0✁✁0✁0
$ # This doesn't work because the \ is removed by bash before sed sees it
$ echo 011010 | sed s/1/\xE2\x9C\x81/g
0xE2x9Cx81xE2x9Cx810xE2x9Cx810
$ # So that was the same as: sed s/1/xE2x9Cx81/g