2011-05-04 78 views
6

任何人都可以用英语解释这个sed单线程(更详细,更好)吗?Makefile中混淆Sed单线程教程

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

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

我有一个非恒定的源文件集,并希望自动生成我的依赖关系树,基于内容(包括)中阐述了我源文件。

我正在按照教程很好,直到...

P.S.我对sed选择/替换有基本的了解,但是我被匹配的字符串和所有重定向层所困惑......我也通读了makefile教程,因此具有标准 makefiles的基本知识。 。

+1

测试时,可暂时去除RM部分或把回声有说像我现在被删除,如果我是在生产模式。 – octopusgrabbus 2011-05-04 22:19:21

+0

我的眼睛在流血。 – 2011-05-05 02:09:18

回答

11

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

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 

本来可以制成:

sed 's/$*\.o[ :]*/$*.o [email protected] : /g' < $*.d > [email protected] 
+0

太棒了!非常感谢你......我看到第一个'rm'移除了'foo.d' ......第二个它在我看来像是检查'foo.P',然后在它不存在的情况下将其删除?这没有意义。有人能给我一个关于''[conditional] || command'逻辑如何在shell脚本中工作的简单解释吗? – 2011-05-05 22:39:55