在awk中更改sprintf的语言环境(LC_ALL)

时间:2018-06-27 08:01:23

标签: awk locale

我想使用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()即可达到相同结果的方法?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法是创建包装器脚本

$ cat cawk
LC_ALL=C gawk "$@"

使其可执行

$ chmod +x cawk

它的工作原理类似于gawk

$ ./cawk -v a=42 'BEGIN {print a}'
42