任何人都可以用英语解释这个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 ......
答案 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\)
并将第一个替换设置为匹配(即foo
)foo
匹配文字点,\.
匹配任意数量的空格和冒号。
正如您所看到的,[ :]*
替换有点多余,因为匹配的字符串是固定的。这也可以起作用。
\1
本可以来自:
sed 's/foo\.o[ :]*/foo.o foo.P : /g' < foo.d > foo.P