Makefile解析字符串

时间:2013-01-03 18:46:22

标签: string parsing variables makefile

我想解析Makefile中的字符串以包含在.c文件中。 由于我的控制情况,许多文件中都有reduntant条目。条目的格式可能略有不同。我可以改变原始定义下游的内容,这会使事情变得更加困难。所以这就是我所拥有的:

以下是我从调用makefile输入的3个示例(数字是随机的)。

ORIG1 = S12a1234A5678

ORIG2 = S123a1234A5678

ORIG3 = S123123456789

所以我对最后9位数感兴趣,并将它们格式化如下。

输出应该通过在字符串末尾的第5个数字前面加上'0'分配给另一组makefile变量,如果它包含'A',否则抓住最后9位数。 OUT1 = 12340A5678

OUT2 = 12340A5678

OUT3 = 123456789

如果可以在Makefile中创建输出而不是shelling,则更为可取。 我试着用sed悲惨地失败了。任何帮助都会得到满足。

2 个答案:

答案 0 :(得分:1)

targ:
    @echo $(ORIG1) | sed '/A/s/\(.*\)\(\([0-9][^0-9]*\)\{5\}\)/\10\2/;s/.*\(\([0-9\][^0-9]*\)\{9\}\)/\1/' >> destination.c

请注意,此转换发生在命令中,因此它由shell中的sed处理。

可以使用Make函数来执行它,而不需要调用任何shell,但你真的不应该。 Make不是为这种解析而设计的,所以解决方案会很糟糕。

答案 1 :(得分:0)

我确信提问者在3年后继续前进,但如果其他人对此感兴趣,那么这是一种模块化的方式来完成任务。

hasA     = $(findstring A,$(1))
lastN    = $(shell echo -n $(1) | tail -c $(2))
firstN   = $(shell echo -n $(1) | head -c $(2))
smack0   = $(1)0$(2)
AFormat  = $(call smack0,$(call firstN,$(1),4),$(call lastN,$(1),5))
myFormat = $(if $(call hasA,$(1)),$(call AFormat,$(1)),$(1))
func9    = $(call myFormat,$(call lastN,$(1),9))

# AFormat   = smack0 (firstN (string,4),lastN (string,5))
# myFormat  = hasA (string) ? AFormat (string) : string
# func9     = myFormat (last9 (string))

test:
    @echo hasA     "(1234B66547) ->" $(call hasA,1234B66547)
    @echo lastN    "(RosieODonnellSuperManVelociraptor123456789,9) ->" $(call lastN ,RosieODonnellSuperManVelociraptor123456789,9)
    @echo smack0   "(1234,0,ABCD) ->" $(call smack0,1234,ABCD)
    @echo func9    "(S12a1234A5678 ) ->" $(call func9,S12a1234A5678)
    @echo func9    "(S123a1234A5678) ->" $(call func9,S123a1234A5678)
    @echo func9    "(S123123456789 ) ->" $(call func9,S123123456789)

诚然,您可以将此视为仅编写一个脚本的变体 自动执行“func9”&的任务称那个w / $(shell func9 $(STR)),但谁知道,也许你不想打扰保存一个只与某些制作配方有关的小脚本&你宁愿把它保存在一些帮助器makefile中。