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

Bru*_*ord 0 unicode bash printf sed

所以我从printf生成了这个输出

    011010
Run Code Online (Sandbox Code Playgroud)

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

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

    Position: 0x2701
    Decimal: 9985
    Symbol: ?
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 7

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

$ echo 011010 | sed $'s/1/\u2701/g'
0??0?0
Run Code Online (Sandbox Code Playgroud)

如果您有Gnu sed,则可以在s//命令中使用转义序列.sed不幸的是,Gnu 不了解\uunicode逃逸,但它确实理解\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
Run Code Online (Sandbox Code Playgroud)

  • 有多种“ sed”方言。并非所有人都理解\ xAF逸出。一个可移植的替代方案可能是“ perl -pCSD -e's / 1 / \ x {2701} / g”。 (2认同)