printf 字段宽度不支持多字节字符?

Aes*_*hir 4 bash shell printf sh

我希望 printf 在计算字段宽度时识别多字节字符,以便列正确排列...我找不到这个问题的答案,想知道这里是否有人有任何建议,或者可能是函数/脚本可以解决这个问题。

\n\n

这是一个快速而肮脏的例子:

\n printf "## %5s %5s %5s ##\\n## %5s %5s %5s ##\\n" \'\' \'*\' \'\' \'\' "\xe2\x80\xa2" \'\'\n >##           *       ##\n >##         \xe2\x80\xa2       ##\n

\n\n

显然,我想要的结果是:

\n >##           *       ##\n >##           \xe2\x80\xa2       ##\n

\n\n

有什么办法可以实现这个目标吗?

\n

nin*_*alj 5

我能想到的最好的是:

\n\n
function formatwidth\n{\n  local STR=$1; shift\n  local WIDTH=$1; shift\n  local BYTEWIDTH=$( echo -n "$STR" | wc -c )\n  local CHARWIDTH=$( echo -n "$STR" | wc -m )\n  echo $(( $WIDTH + $BYTEWIDTH - $CHARWIDTH ))\n}\n\nprintf "## %5s %*s %5s ##\\n## %5s %*s %5s ##\\n" \\\n    \'\' $( formatwidth "*" 5 ) \'*\' \'\' \\\n    \'\' $( formatwidth "\xe2\x80\xa2" 5 ) "\xe2\x80\xa2" \'\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

您使用*宽度说明符将宽度作为参数,并通过添加多字节字符中的附加字节数来计算所需的宽度。

\n\n

请注意,在 GNU wc 中,-c返回字节,并且-m返回(可能是多字节)字符。

\n