在 awk match 函数的字符串参数中使用特殊字符。当前区域设置

2024-03-28

我在使用时遇到问题match函数于awk在包含特殊字符的字符串上。考虑文件test.awk:

{
    match($0,"(^.*)kon",a);
    print a[1];
}

以及相应的测试文件“test.txt”,其内容为“Testing Håkon”(注意挪威语字符“å”)。该文件采用“iso-8859-1”编码,长度为14字节。文件的十六进制转储由下式给出xxd -p test.txt as

54657374696e672048e56b6f6e0a

从中我们可以看到,挪威语字符“å”已被编码为十六进制数“e5”。即该文件使用iso-8859-1编码进行编码。

Running

awk  -f test.awk test.txt

在终端上没有给出任何内容..而正确的输出应该是“Testing Hå”..

运行的输出locale命令是:

LANG=en_DK.UTF-8
LANGUAGE=en_US:
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=

这表明“LANG”变量设置为 utf-8 编码。


我已将您的代码修改为:

{
    match($0,"(^.*)kon",a);
    print ">>>" a[1] "<<<";
}

运行结果GNU Awk 3.1.6在 Windows 7 下:

>>>Hå<<<

Ubuntu下运行GNU Awk 3.1.8 I get:

>>><<<

为了获得所需的输出,我必须暂时更改区域设置并进行翻译:

LC_ALL=ISO_8859-1 awk -f test.awk test.txt | iconv -f ISO_8859-1 -t UTF-8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 awk match 函数的字符串参数中使用特殊字符。当前区域设置 的相关文章

随机推荐