You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GNU Make变量替换表达式能否一次性匹配多种模式?

一次变量替换实现多后缀替换(.c/.cpp → .o)

当然可以一次完成,以Bash为例,利用扩展模式匹配结合参数替换就能实现全局多后缀替换,无需多次处理。

具体实现步骤:

  1. 确保Bash开启了extglob扩展(大部分默认环境已开启,未开启则执行shopt -s extglob)
  2. 假设你的文件列表存储在变量中:
    files="main.c utils.cpp config.h test.cc"
    
  3. 执行一次变量替换:
    processed_files="${files//@(.c|.cpp)/.o}"
    

语法解释:

  • ${var//pattern/replacement}:全局替换变量var中所有匹配pattern的内容为replacement
  • @(.c|.cpp):扩展模式语法,精确匹配.c或.cpp后缀

执行后processed_files的结果为:main.o utils.o config.h test.cc,完美实现了仅替换目标后缀的需求。

单个文件处理示例:

如果只处理单个文件名:

file="foo.cpp"
new_file="${file/@(.c|.cpp)/.o}"
# new_file 结果为 foo.o

Makefile场景补充:

如果是在Makefile中,也可以用循环结合条件判断实现一次替换:

SRCS = main.c utils.cpp config.h
OBJS = $(foreach src,$(SRCS),$(if $(filter %.c %.cpp,$(src)),$(src:.%=.o),$(src)))

不过实际项目中两次替换的写法更简洁直观,但如果严格要求一次变量/引用替换,上述循环方式也能满足需求。

内容的提问来源于stack exchange,提问作者Michael57

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:00:52