0

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

这是我可以从调用生成文件中获得的输入的 3 个示例(数字是随机的)。

ORIG1=S12a1234A5678

ORIG2=S123a1234A5678

ORIG3=S123123456789

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

如果输出包含“A”,则应通过在字符串末尾的第 5 个数字之前插入“0”来将输出分配给另一组 makefile 变量,否则获取最后 9 个数字。OUT1=12340A5678

OUT2=12340A5678

输出3=123456789

如果可以在 Makefile 中创建输出而不是脱壳,则更可取。我尝试使用 sed 失败了。任何帮助都将不胜感激。

4

2 回答 2

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

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

可以使用 Make 函数来完成此操作,而无需调用任何 shell,但您确实不应该. Make 不是为这种解析而设计的,所以解决方案会很糟糕。

于 2013-01-04T00:45:56.400 回答
1

我敢肯定,提问者在 3 年后继续前进,但如果其他人对此感兴趣,这里是一种模块化的方式来完成任务 w/make。

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”任务并调用该脚本的一种变体,$(shell func9 $(STR))但是谁知道呢,也许您不想费心保存仅与某些制作食谱相关的小脚本&您宁愿将其保存在一些帮助文件中。

于 2016-12-21T22:43:55.067 回答