sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
p-162:sed替换命令的格式是‘s///g’如果没有g,则sed的替换操作只对文本中的第一次出现的匹配模式进行替换。关于‘s///’命令的另一个注意点是‘/’分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在’s’之后指定一个不同的字符来更改分隔符。例如,下列将把所有出现的/usr/local替换成/usr:
sed –e ‘s:/usr/local:/usr:g’ mylist.txt
在该例中,使用冒号作为分隔符。如果需要在规则表达式中使用分隔符,可以在它前面加入反斜杠。关于\(\)是保留的模式空间,参见p-70,$* 是makefile中匹配的“茎”,$$$$表示当前进程的进程号,命令行中还运用了输入输出重定向。