[TOC] # 例子 %.d: %.c @set -e; rm -f $@; \ $(CC) -M $(CPPFLAGS) $< >; $@.$$$$; \ sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ >; $@; \ rm -f $@.$$$$ 简单来讲就是替换。这里采用逗号作为基本语法的分隔。一般的形式是sed 's/pattern/new/g' \$∗\.o[ :]*替换为\1.o \$@ : 后面的g表示全局替换,就是不止替换一次。 同时又是用在makefile当中,所以要牵扯到\$*,\$@之类的自动变量。 \$*,表示的是target的除去了suffix后的filename,也就是%.d: %.c当中的%部分。 \$@,表示的是target,也就是%.d sed操作的文件是来自上面命令的生成的临时文件\$@. 最后再把sed的输出定向到零时文件\$@. ```shell clean: sed 's,\(main\)\.o[:]*,\1.o main.d:,g' < main.d.temp > main.d ``` ![](https://leanote.com/api/file/getImage?fileId=5a571eccab64415def001172) > [sed详解](http://www.mamicode.com/info-detail-1310929.html)