在Makefile教程中混淆了Sed One-Liner

时间:2011-05-04 22:02:06

标签: c linux makefile sed

任何人都可以用英语解释这个sed单行(更详细,更好)吗?

@sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
             rm -f $*.d; [ -s $@ ] || rm -f $@

这是本教程的一部分: http://mad-scientist.net/make/autodep.html

我有一组非常量的源文件,并希望根据源文件中拼写的内容(包括)自动生成我的依赖树。

我很好地遵循了教程,直到那......

P.S。我对sed select / replace有基本的了解,但是我对匹配的字符串和重定向的所有层感到困惑....我还阅读了makefile教程一次,因此具备标准的基本知识 makefiles ......

1 个答案:

答案 0 :(得分:12)

sed模式将首先由make处理,因此如果它适用的规则是尝试构建foo.P,那么$@将被转换为foo.P和{{1}到$*。这意味着实际的sed命令将类似于:

foo

sed 's/\(foo\)\.o[ :]*/\1.o foo.P : /g' < foo.d > foo.P 完全匹配\(foo\)并将第一个替换设置为匹配(即foofoo匹配文字点,\.匹配任意数量的空格和冒号。

正如您所看到的,[ :]*替换有点多余,因为匹配的字符串是固定的。这也可以起作用。

\1

本可以来自:

sed 's/foo\.o[ :]*/foo.o foo.P : /g' < foo.d > foo.P