我在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编码..
答案 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]
}