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和您的解决方案,并显示您想要得到的结果,这将非常有帮助。