使用正则表达式模式时AWK不同的版本行为

时间:2017-03-13 07:51:17

标签: linux ubuntu awk libopencm3

背景

最近我试图在Ubuntu 14.04上构建libopencm3-examples并遇到构建错误(对于Ubuntu 16.04.1 LTS,它可以正常工作)。我开始挖掘以找到原因。正如我所发现的,libopencm3使用特定的链接器脚本生成器:

请参阅libopencm3-examples/libopencm3/ld/README

此工具的目的是将目标微控制器特定定义传递给链接器脚本模板。因此它在模板脚本下使用预处理器并传递目标特定参数,如下所示:

-D_FPU=hard-fpv5-sp-d16 -D_ROM_OFF=0x08000000 -D_RAM_OFF=0x20000000

检索此参数使用awk脚本。

./libopencm3/scripts/genlink.awk

用于生成-D_XXX密钥,此脚本在设备数据库./libopencm3/ld/devices.data下运行 像这样:

awk -v PAT="$(DEVICE)" -v MODE="DEFS" -f $(OPENCM3_DIR)/scripts/genlink.awk $(OPENCM3_DIR)/ld/devices.data

问题:

awk脚本部分,从数据库中提取定义信息如下所示:

...
for (i = 3; i <= NF; i = i + 1) {
...
    else if ($i ~ /[[:upper:]]*=/) {
        if ("DEFS" == MODE)
            printf "-D_%s ",$i;
    }
}

数据库中的行,由脚本处理:

stm32f3[01]3?c* stm32f3ccm ROM=256K RAM=40K CCM=8K

让我感到困惑的是,建议的模式(/[[:upper:]]*=/)应该匹配[ROM] = 256K f.e.,而不是ROM = 256K(是吗?)。无论如何,正如我已经提到的/[[:upper:]]*=/适用于ubuntu 16.04(GNU Awk 4.1.3)(为什么?),而对于14.04我需要更改/[[:upper:]]*=/ - &gt; /[:upper:]*=/迫使它起作用(这是一个错误还是什么?)。我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

不,方括号字符在正则表达式中是特殊的。如果您想要按字面意思匹配,请使用\[。方括号内的表达式[:upper:]是指由大写字符组成的字符类。我猜你想要

/[][:upper:][]+=/

形成一个括号表达式,包括文字结束方括号,大写字符和文字开口方括号。另请注意,切换到+而非*以阻止匹配单独的等号(*表示零或更多,因此零重复时,它将匹配任何等号)。

你所拥有的Awk可能根本不支持POSIX角色类。然后,您可以将[:upper:]替换为A-Z,但它不会与区域设置敏感匹配。