关于#bash#的问题:Linux shell,在一句printf进行中文格式化输出时,每列每行中文字符数不固定

Linux shell,在一句printf进行中文格式化输出时,如何将每列中文进行左对齐右对齐,每列每行中文字符数不固定。
例如:

img

printf "%-10s :%-8s\n" 上海 12345

%-10s指定字符串的长度是10,字符串长度不够时后面补充空格, 10前面的 - (负号)表示左对齐

下面的教程中有说明:
https://www.runoob.com/linux/linux-shell-printf.html

你首先要确认你前面中文列的最大显示字符宽度,只有确认了,才能真正解决这个问题,注意1个中文字符占用2个显示字符宽度。

假定得到中文字符占用最大字符宽度是16,则

printf "%-16s:%s" 乌鲁木齐 432153

这里的16就是前面获取的最大值,用来明确占位空间大小。

这里后面数字输出因为是紧接的,不用特别处理,直接输出即可,除非其需要右对齐才需要特殊处理。

字符串输出排版类似c语言的printf,前面指定格式,后面指定输出字符。

printf "%-15s:%-10s\n" 上海 12345
printf "%-15s:%-10s\n" 哈尔滨 5678
printf "%-15s:%-10s\n" 乌鲁木齐 432153

不知道你想实现的是不是这种效果。

img


由于中文字符的原因,导致对齐不佳,只能通过脚本内容实现,以下是上图实现的脚本内容:

#!/bin/bash
iforfree_printf(){
    read -p "请输入一组信息并以空格隔开: " info
    zh_counts=`echo $info |awk -F ' ' '{print $1}'|wc -L`
    ((WEIGHT=$zh_counts/2))
    ((WEIGHT=15+$WEIGHT))
    printf "%-${WEIGHT}s:%-s\n" $info
}
while true
do
    iforfree_printf
done  

把第一个字符串右边加空格弄长,再截取,接上第二个字符串