首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用regex模式时AWK不同版本的行为

使用regex模式时AWK不同版本的行为
EN

Stack Overflow用户
提问于 2017-03-13 07:51:17
回答 1查看 74关注 0票数 0

背景:

最近,我尝试在Ubuntu14.04上构建libopencm3 3-实例,并遇到了一个构建错误(而对于Ubuntu16.04.1LTS,它工作正常)。我开始挖掘是为了找出原因。正如我所发现的,libopencm3使用特定的链接器脚本生成器:

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

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

代码语言:javascript
复制
-D_FPU=hard-fpv5-sp-d16 -D_ROM_OFF=0x08000000 -D_RAM_OFF=0x20000000

要检索此参数,需要使用awk脚本。

代码语言:javascript
复制
./libopencm3/scripts/genlink.awk

为了生成-D_XXX键,该脚本在设备数据库./libopencm3/ld/devices.data下运行,如下所示:

代码语言:javascript
复制
awk -v PAT="$(DEVICE)" -v MODE="DEFS" -f $(OPENCM3_DIR)/scripts/genlink.awk $(OPENCM3_DIR)/ld/devices.data

问题:

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

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

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

代码语言:javascript
复制
stm32f3[01]3?c* stm32f3ccm ROM=256K RAM=40K CCM=8K

让我困惑的是,提议的模式(/[[:upper:]]*=/)应该与ROM=256K f.e.相匹配,而不是ROM=256K (是吗?)。无论如何,正如我已经提到的,/[[:upper:]]*=/适用于ubuntu16.04(GNUAwk4.1.3)(为什么?),而对于14.04,我需要更改/[[:upper:]]*=/ -> /[:upper:]*=/来强制它工作(这是一个bug还是什么?)我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 08:10:29

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

代码语言:javascript
复制
/[][:upper:][]+=/

若要形成由文字结束方括号、大写字符和文字开始方括号组成的括号表达式,请执行以下操作。还请注意切换到+而不是*,以防止在一个单独的等号上进行匹配(*的意思是零或更多,所以如果没有重复,它将匹配于任何等号)。

您所拥有的Awk可能根本不支持POSIX字符类。然后,您可以将[:upper:]替换为A-Z,尽管它将无法与地区敏感地匹配。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42758700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档