我想使用sprintf(“%c”)将介于129到255之间的整数值打印到字符串,并且对《 GNU Awk用户指南》中提到的以下语句有疑问:
注意:POSIX标准说字符串的第一个字符是 印刷。在具有多字节字符的语言环境中,gawk尝试执行以下操作: 将字符串的前导字节转换为有效的宽字符 然后打印该字符的多字节编码。同样, 打印数字值时,gawk允许该值在 可以用宽字符保存的数值的数字范围。如果 转换为多字节编码失败,gawk使用低八位 值作为要打印的字符。
这将导致以下输出:
[:~]$ gawk 'BEGIN {retString = sprintf("%c%c%c", 129, 130, 131); print retString}' | od -x
0000000 81c2 82c2 83c2 000a
在每个字节(0x81、0x82、0x82)的前面添加一个额外的字节(0xc2)。我可以通过将LC_ALL设置为C来避免这种情况:
[:~]$ LC_ALL=C gawk 'BEGIN {retString = sprintf("%c%c%c", 129, 130, 131); print retString}' | od -x
0000000 8281 0a83
现在的问题是:如何在awk中更改语言环境而不在awk脚本外部设置LC_ALL?我想在多个系统上使用此脚本,并且不希望输出取决于默认的语言环境设置。
还是有另一种无需调用sprintf()即可达到相同结果的方法?
答案 0 :(得分:0)
我认为最简单的方法是创建包装器脚本
$ cat cawk
LC_ALL=C gawk "$@"
使其可执行
$ chmod +x cawk
它的工作原理类似于gawk
$ ./cawk -v a=42 'BEGIN {print a}'
42