我想解析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悲惨地失败了。任何帮助都会得到满足。
答案 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中。