我有一个由printf生成的输出
011010
现在我想使用管道并使用sed来替换0和1,用unicode字符代替二进制(011010)输出。 我可以复制粘贴字符本身来实现此操作,但我想使用像unicode表中找到的值这样的值代替它们。
Position: 0x2701
Decimal: 9985
Symbol: ✁
如何使用sed与上述值来生成字符?
使用bash (自 v4.2 起) 或 zsh,简单的解决方案是使用 $'...'
语法,它可以理解C转义字符,包括 \u
转义:
$ echo 011010 | sed $'s/1/\u2701/g'
0✁✁0✁0
$ # 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
sed
方言;并非所有方言都理解 \xAF
转义。一个可移植的替代方案可能是 perl -pCSD -e 's/1/\x{2701}/g'
。 - tripleeebash
(它保证支持 C 转义)而不是 sed
(它只有作为 GNU 扩展的转义)是一个好主意。 - abarnertsed
的事情是因为你对问题的评论和OP的回复。 - rici
sed
不理解 Unicode 字符,它只理解字节,因此您无法将 U+2701 替换为其它字符。您可以替换为 U+2701 的 UTF-8 编码,但就sed
而言,这只是三个字节\xE2
、\x9c
和\x81
。 (当然,除非您的输出被解释为 UTF-8,否则这实际上不会成为字符 U+2701。) - abarnert