尝试这个
echo 'Ü X' | awk '{printf("|% 2s|% 2s|\n", $1, $2)}'
对于 的输出|Ü| X|
。显然awk
计算的是字节长度,而不是 的字符长度Ü
,因此计数为 2,并且不需要用空格进行左填充,就像 一样X
。
是否可以awk
在计算模式字符长度%<count>s
printf
而不是字节长度的模式下运行?
存在同样的问题:bash
https : //superuser.com/a/1599024/345087。我希望答案不一样:“passthrough to libc printf”:-/printf
编辑而不是评论以获得更好的可见性:我没有使用但gawk
为我安装的任何版本的 ubuntu 22.04。我没有想到gawk
这些天可以安装任何东西:-/感谢您的详细回答。
GNU awk(可能还有其他一些 awk 变体):
Bash 3.0+(可能还有一些其他 shell,可能进行了调整):
请注意,bash 版本必须
LC_ALL
在正在执行的 shell 中设置${#a}
,而不仅仅是在printf
版本发生的环境中设置awk
,因此如果您不想LC_ALL
在调用 shell 中更改,则需要保存/恢复它,即o="$LC_ALL"; LC_ALL='en_US.UTF-8' ... "$b"; LC_ALL="$o"
,或者在子 shell 中执行所有操作,即( LC_ALL='en_US.UTF-8' ... "$b" )
.说明:
来自GNU awk 文档:
使用 GNU awk 5.2.2 设置适当的语言环境会将多字节字符视为单个多字节字符:
而使用不同的语言环境或使用
-b
,会将所有输入视为单字节字符:使用时,
-b
结果与您的区域设置无关:正如@StéphaneChazelas在评论中提到的,请参阅Why is printf "shrinking" umlaut?
printf
对于shell 中的相关行为,其中@Léa Gris 的回答表明这将获得字符计数,因此格式化的输出在 bash 3.0 及更高版本中是正确的:该功能也受区域设置的影响:
有关获取 bash 中字符长度的更多信息,另请参阅length -of-string-in-bash 。