如何在Make中实现a→1、b→2、c→3的多字符串替换?
Make多字符串替换实现方案
方法1:嵌套使用$(subst)函数
这是最直接的实现方式,适合替换规则较少的场景,利用Make内置的$(subst FROM,TO,TEXT)函数多次嵌套,依次完成每一组替换:
# 定义需要处理的原始字符串 SOURCE_STR := abcabc # 依次完成a→1、b→2、c→3的替换 TARGET_STR := $(subst c,3,$(subst b,2,$(subst a,1,$(SOURCE_STR)))) # 验证结果 all: @echo 替换后结果: $(TARGET_STR)
执行make后会输出替换后结果: 123123,符合预期。
方法2:封装自定义函数(适合多替换规则场景)
如果后续需要扩展更多替换规则,可以把多替换逻辑封装成自定义函数,维护起来更方便:
# 定义多替换函数:参数1是替换规则组,参数2是原始字符串 define multi_replace $(foreach rule,$1,$(eval tmp_str := $(subst $(word 1,$(rule)),$(word 2,$(rule)),$(tmp_str)))) $(tmp_str) endef # 定义替换规则:每组为「原字符 目标字符」的格式 REPLACE_RULES := (a 1) (b 2) (c 3) # 原始字符串 SOURCE_STR := abcabc # 调用自定义函数完成替换 TARGET_STR := $(call multi_replace,$(REPLACE_RULES),$(SOURCE_STR)) # 验证结果 all: @echo 替换后结果: $(TARGET_STR)
执行make同样会得到正确的替换结果,后续要新增替换规则,只需在REPLACE_RULES里添加新的规则组即可。
注意:如果替换规则存在依赖顺序(比如先替换
a为b,再替换b为2),需要调整规则组的排列顺序,确保先执行前置替换。
内容的提问来源于stack exchange,提问作者Gruppenhäuser Lehmann
相关产品推荐
相关产品推荐

