gawk 中的 Printf 是否使用了正确的编码?

gawk 中的 Printf 是否使用了正确的编码?

我想知道:除了 ASCII 之外,gawk printf 还可以使用任何格式吗?

目前,我正在使用 gawkmatch()搜索一些 UTF-8 文本。当我继续打印出 gawk 找到的匹配项时,结果如下所示:

Chapter 9\n\xE2\x80\x9COh, I Get By with a Little Help from My Friends\xE2\x80\x9D: Short-Term Writing Center/Community Collaborations

当我真的希望它看起来像这样时:

Chapter 9 “Oh, I Get By with a Little Help from My Friends”: Short-Term Writing Center/Community Collaborations

我的代码:

gawk '
    match($0, /^[\|\+-].*"([^"]+)".*#([[:digit:]]+)/, m) {
        print m[2]
    }
' file.txt

答案1

是的,gawk在当前语言环境中运行,因此它应该可以在系统支持的任何编码下工作。您可以在 gawk 的手册页中看到许多对 Unicode 和 UTF-8 的引用

POSIX 标准要求 awk 以字符而非字节为单位运行。因此,在 gawk 中,、、和length()其他字符串函数(请参阅字符串操作函数部分)均以本地字符集中的字符为单位运行,而不是以字节为单位运行。(但并非所有 awk 实现都这样做)。substr()split()match()

GNU Awk 用户指南

如果它在你的系统上不起作用,那是因为当前语言环境的编码不是 UTF-8。你需要进行LC_ALL相应的设置。这是一个简单的例子

$ echo '第 9 章“哦,在朋友的帮助下我度过了难关”:' | \
LC_ALL=en_US.UTF-8 gawk'/with/'
第九章 “哦,在朋友的帮助下我度过了难关”

相关内容