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

时间:2013-05-26 15:02:27

标签: character-encoding awk

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

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

和相应的测试文件“test.txt”,内容为“TestingHåkon”(请注意挪威字符“å”)。该文件以“iso-8859-1”编码,长度为14个字节。文件的十六进制转储由xxd -p test.txt提供为

54657374696e672048e56b6f6e0a

从中我们可以看到挪威字符“å”已经用十六进制数“e5”编码。也就是说,文件是使用iso-8859-1编码编码的。

正在运行

awk  -f test.awk test.txt

终端没有任何内容..正确的输出应该是“测试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编码..

2 个答案:

答案 0 :(得分:2)

我已将您的代码修改为:

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

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

>>>Hå<<<

在Ubuntu下运行GNU Awk 3.1.8我得到:

>>><<<

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

LC_ALL=ISO_8859-1 awk -f test.awk test.txt | iconv -f ISO_8859-1 -t UTF-8

答案 1 :(得分:1)

这不是awk的问题,请参见here。您的locale期待UTF-8编码,但您的文件正在使用iso-8859-1,因此请将locale设置为与您的文件匹配,反之亦然。

注意:match()的第二个参数应该是正则表达式,并且不需要尾随;

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