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

Jas*_*ick 7 c linux makefile sed

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

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

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

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

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

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

CB *_*ley 12

战略经济对话模式将被make首先进行处理,所以如果它的适用规则,极力打造foo.P然后$@将被转换为foo.P$*foo.这意味着实际的sed命令将类似于:

sed 's/\(foo\)\.o[ :]*/\1.o foo.P : /g' < foo.d > foo.P
Run Code Online (Sandbox Code Playgroud)

\(foo\)foo完全匹配并将第一个替换设置为匹配(即foo)\.匹配文字点并[ :]*匹配任意数量的空格和冒号.

正如您所看到的\1那样,由于匹配的字符串是固定的,因此替换有点多余.这也会起作用.

sed 's/foo\.o[ :]*/foo.o foo.P : /g' < foo.d > foo.P
Run Code Online (Sandbox Code Playgroud)

这本可以来自:

sed 's/$*\.o[ :]*/$*.o $@ : /g' < $*.d > $@
Run Code Online (Sandbox Code Playgroud)