我希望printf在计算字段宽度时识别多字节字符,以便列正确对齐。。。我找不到这个问题的答案,我想知道这里是否有人有任何建议,或者可能有一个函数/脚本来解决这个问题。
下面是一个快速而肮脏的例子:printf "## %5s %5s %5s ##\n## %5s %5s %5s ##\n" '' '*' '' '' "•" ''
>## * ##
>## • ##
显然,我想要结果:>## * ##
>## • ##
有什么办法可以做到这一点吗?
最佳答案
我能想到的是:
function formatwidth
{
local STR=$1; shift
local WIDTH=$1; shift
local BYTEWIDTH=$( echo -n "$STR" | wc -c )
local CHARWIDTH=$( echo -n "$STR" | wc -m )
echo $(( $WIDTH + $BYTEWIDTH - $CHARWIDTH ))
}
printf "## %5s %*s %5s ##\n## %5s %*s %5s ##\n" \
'' $( formatwidth "*" 5 ) '*' '' \
'' $( formatwidth "•" 5 ) "•" ''
使用
*
宽度说明符将宽度作为参数,并通过在多字节字符中添加额外字节数来计算所需的宽度。注意,在GNU wc中,
-c
返回字节,-m
返回(可能是多字节)字符。