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

qyzbxkaa  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(135)

我试图将一组固定的ASCII字符Map到一组固定的Unicode字符,也就是说,对于0-9中的每一个数字,我想得到带圈的数字的等价值。

mapFrom="0123456789"
mapTo="🄋➀➁➂➃➄➅➆➇➈"

today=20221018

#convert to "➁🄋➁➁➀🄋➀➇"
todayWithCircles=$(do_something_here) # <-- what's the "something"?

echo $todayWithCircles
# output: ➁🄋➁➁➀🄋➀➇

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

pepwfjgg

pepwfjgg1#

使用perl进行转换的快速而粗略的方法:

#!/usr/bin/env bash

mapFrom="0123456789"
mapTo="🄋➀➁➂➃➄➅➆➇➈"
today=20221018

perl -CSD -Mutf8 -pe "tr/$mapFrom/$mapTo/" <<<"$today"

输出

➁🄋➁➁➀🄋➀➇

(当然,假设脚本是用UTF-8编码的。-CSD告诉perl对标准输入、输出和其他打开的文件使用UTF-8编码,-Mutf8告诉perl脚本本身(-e的参数)是用UTF-8编码的。)
如果您有可用的GNU sed,则可以使用它:

sed "y/$mapFrom/$mapTo/" <<<"$today"

(See this unix stackexchange Q&A,了解tr不适用的原因)

6tqwzwtp

6tqwzwtp2#

这是一个纯粹的狂欢方式。
循环遍历字符串的每个字符,并将其替换为 rounded character

#!/usr/bin/env bash

mapTo="🄋➀➁➂➃➄➅➆➇➈"
today=0987654321

for ((i = 0; i < ${#today}; i++)); do
  echo -n "${mapTo:${today:$i:1}:1}"
done

实验结果:
🄋➈➇➆➅➄➃➂➁➀

相关问题