Makefile GNU make中for循环中的字符串替换
假设存在具有相同项数的列表Makefile GNU make中for循环中的字符串替换,makefile,gnu-make,Makefile,Gnu Make,假设存在具有相同项数的列表xl和yl,以及现有字符串s。我想用s中的yl项替换xl项。也就是说,对于xl中的每个x,我想调用$(subst x,y,$(s)),其中y是yl中的对应项。我试过这样做: ns := $(shell seq $(words $(xl))) t := $(foreach i,$(ns),$(subst $(word $(i),$(xl)),$(word $(i),$(yl)),$(s)) 但这不起作用,因为foreach扩展s导致t中的重复 什么是获得我想要的结果的好
xl
和yl
,以及现有字符串s
。我想用s
中的yl
项替换xl
项。也就是说,对于xl
中的每个x
,我想调用$(subst x,y,$(s))
,其中y
是yl
中的对应项。我试过这样做:
ns := $(shell seq $(words $(xl)))
t := $(foreach i,$(ns),$(subst $(word $(i),$(xl)),$(word $(i),$(yl)),$(s))
但这不起作用,因为foreach
扩展s
导致t
中的重复
什么是获得我想要的结果的好方法?谢谢。我想你必须分别对
s
的每个单词进行操作
比如:
t := $(foreach w,$(s),$(foreach i,$(ns),$(subst $(word $i,$(xl)),$(word $i,$(yl)),$w)))
使用递归宏生成数字序列,并使用
evaĺ
进行文本替换,对于GNU make 4.2.1:
s:=ABC def GHI bedeft GHI JKL xyz fnops
xl:=abc def ghi nop
yl:=jkl mno pqr(NOP)
#以1美元列出从1到列表长度(<10亿)的自然数,如果1美元为空则无效
seqn=$(strip$(如果$(strip$1),$(调用seqn,$(wordlist 29999999,$1))$(words$1),)
ns:=$(调用seqn,$(patsubst%,x,$(xl)))
t:=$(s)
美元(每一个一,美元)\
$(eval t:=$$(subst$(word$(i),$(xl)),$(word$(i),$(yl)),$$(t)))
冒牌货:全部
全部:$(foreach v,ns s t,$(信息$(v):[$($(v))]))
来自make--silent的输出:
ns: [1 2 3 4]
s: [ABC def GHI bedeft ghi JKL xyz fnops]
t: [ABC mno GHI bemnot pqr JKL xyz f(NOP)s]
编辑
foreach
应该循环替换列表的索引,而不是目标字符串
- 使用
$(patsubst%,x,list)调用seqn
宏以获得速度
- 只有
$(subst…
和$(t)
需要在eval
stmt中使用$
进行转义
如果我理解正确,这只是一个递归函数:
multi-subst = $(if $1,$(call multi-subst,$(wordlist 2,10000,$1),$(wordlist 2,10000,$2),$(subst $(firstword $1),$(firstword $2),$3)),$3)
s = abc dca acacd
xl = a c
yl = 1 3
s_new := $(call multi-subst,$(xl),$(yl),$(s))
当然,不可能替换包含空格的子字符串。关于字符串和列表的更多函数,您可能想看一看这似乎是一个很好的聪明解决方案,只是我得到了一个空字符串。有什么东西需要逃走吗?有一个失踪的近邻;多个子集的结尾应为,$3)),$3)
(注意第一个$3
后的双参数。之后值s_new
被替换。@madscietrict抱歉,你是对的。将修复此问题。这不起作用。由于foreach扩展怪癖,它会重复。我明白了。s
不是多次扩展的情况。问题在于每次通过循环,每个单词都会被替换,然后附加到上一次通过循环的结果中。对于此类问题,如果您提供一个示例makefile和您的解决方案,并显示您想要得到的结果,这将非常有帮助。