Bash 脚本 - 将 ASCII 字符映射到定义字符串中对应的 Unicode 字符

Mar*_*arc 1 bash shell

我正在尝试将一组固定的 ASCII 字符映射到一组固定的 Unicode 字符。即,对于每个数字 0-9,我想获得等效的圆圈数字。

\n
mapFrom="0123456789"\nmapTo="\xe2\x9e\x80\xe2\x9e\x81\xe2\x9e\x82\xe2\x9e\x83\xe2\x9e\x84\xe2\x9e\x85\xe2\x9e\x86\xe2\x9e\x87\xe2\x9e\x88"\n\ntoday=20221018\n\n#convert to "\xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x80\xe2\x9e\x80\xe2\x9e\x87"\ntodayWithCircles=$(do_something_here) # <-- what's the "something"?\n\necho $todayWithCircles\n# output: \xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x80\xe2\x9e\x80\xe2\x9e\x87\n
Run Code Online (Sandbox Code Playgroud)\n

给定两个长度相等的固定字符串,根据它们在字符串中的位置来映射它们的最简单方法是什么?

\n

Sha*_*awn 5

一种快速而肮脏的perl翻译方法:

\n
#!/usr/bin/env bash\n\nmapFrom="0123456789"\nmapTo="\xe2\x9e\x80\xe2\x9e\x81\xe2\x9e\x82\xe2\x9e\x83\xe2\x9e\x84\xe2\x9e\x85\xe2\x9e\x86\xe2\x9e\x87\xe2\x9e\x88"\ntoday=20221018\n\nperl -CSD -Mutf8 -pe "tr/$mapFrom/$mapTo/" <<<"$today"\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
\xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x81\xe2\x9e\x80\xe2\x9e\x80\xe2\x9e\x87\n
Run Code Online (Sandbox Code Playgroud)\n

(当然,假设脚本以 UTF-8 编码。-CSD告诉 perl 对标准输入、输出和其他打开的文件使用 UTF-8 编码,-Mutf8告诉它脚本本身( 的参数-e)以 UTF-8 编码.)

\n

如果您有可用的 GNU sed,则可以使用它:

\n
sed "y/$mapFrom/$mapTo/" <<<"$today"\n
Run Code Online (Sandbox Code Playgroud)\n

(请参阅此 unix stackexchange Q&A了解为什么tr不合适)

\n