2011-05-04 76 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