背景:
最近我试图在ubuntu 14.04上构建libopencm3-examples,但遇到了一个构建错误(而对于ubuntu 16.04.1lts,它可以正常工作)。我开始挖掘以便找到原因。正如我发现的,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脚本部分,从数据库中提取defines信息,如下所示:
...
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:]]*=/
>/[:upper:]*=/
来强制它工作(这是一个bug还是什么?)我有什么遗漏吗? 最佳答案
不,方括号字符在regex中是特殊的。如果您想逐字匹配,请使用\[
。方括号内的表达式[:upper:]
是指由大写字符组成的字符类。我猜你想要
/[][:upper:][]+=/
形成一个由右方括号、大写字符和右方括号组成的括号表达式。还要注意切换到
+
而不是*
以防止在一个单独的等号上匹配(*
表示零或更多,因此如果重复次数为零,它将匹配任何等号)。可能你的awk根本不支持posix字符类。然后,您可以将
[:upper:]
替换为A-Z
,尽管它不会敏感地匹配区域设置。关于linux - 使用正则表达式模式时,AWK不同版本的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42758700/