shell中printf对齐中文

编写shell脚本时候,发现printf不能对齐中文。看看printf是哪里的

type printf
# 是bash自带的
printf is a shell builtin

printf对齐英文

printf "%20s\n" ""
printf "%20s\n" "a"
printf "%20s\n" "aa"
printf "%20s\n" "aaa"
# 对应的输出,没有问题
                    
                   a
                  aa
                 aaa

printf对齐中文

printf "%20s\n" ""
printf "%20s\n" "我"
printf "%20s\n" "我我"
printf "%20s\n" "我我我"
# 对应的输出
# 一个汉字替代了三个空格,但是字宽是个两个空格。
                    
                 我
              我我
           我我我

这就简单了,计算出中文字符数就可以了

#
# UTF8编码下,汉字通常是3个byte,通过它来判断【中英常见字符组成的字符串】中汉字的数量
#
count_zh_char() {
    local zh_str="${1}"
    local byte_count
    local char_count
    local zh_count
    byte_count=$(printf "${zh_str}" | wc -c)
    char_count=$(printf "${zh_str}" | wc -m)
    zh_count=$(((byte_count - char_count) / 2))
    echo ${zh_count}
}

echo  "+--------------------------------------------------------------------+"
hint_item="我是大坏蛋"
hint_zh_count=$(count_zh_char "${hint_item}")
hint_width=$((hint_zh_count + 59))
printf "%-${hint_width}s %10s\n"  "| ${hint_item}" "2.7M |"


hint_item="dio-20210718-155132-abcdef.tgz.zip"
hint_zh_count=$(count_zh_char "${hint_item}")
hint_width=$((hint_zh_count + 59))
printf "%-${hint_width}s %10s\n"  "| ${hint_item}" "2.85M |"

hint_item="dio-18-155132.tgz.zip"
hint_zh_count=$(count_zh_char "${hint_item}")
hint_width=$((hint_zh_count + 59))
printf "%-${hint_width}s %10s\n"  "| ${hint_item}" "2.12345M |"
echo  "+--------------------------------------------------------------------+"

打赏作者

Copyright © 2021,枫糖, 版权所有,禁止转载、演绎、商用。
离开前,建议您浏览一下 归档 页面,或许有更多相关的、有趣的内容!

添加评论

code