2015-05-04 37 views

回答

1

因爲它在sed命令中使用,其中裸露的/將被視爲s///命令的結尾。

話雖這麼說,一個替代的解決方案(假設你能做出哪些字符是在目錄名法律作出任何保證)本來已經使用了不同的分隔符爲s///;(即s;.*\.o;$(dir [email protected])&;g)或!(即s!.*\.o!$(dir [email protected])&!g

+0

感謝,爲什麼'subst'的第一個參數'/'不是由\前綴? –

+0

因爲在這種情況下'/'不是特殊的,所以它不需要被轉義。這是在'$(dir $ @)'的值中用'\ /'替換'/'的。 –

+0

明白了,再次感謝 –

0

看起來像他們改變/到轉義版本。

+0

問題是「爲什麼」而不是「什麼」。 –

2

路徑斜槓需要,因爲sed腳本使用斜槓作爲正則表達式分隔符進行轉義。未轉義的斜線會過早地終止替換表達式。

然而,一個更好的辦法來解決,這將是使用備用分隔符 - sed幫忙,讓你在這裏使用任何標點符號字符;斜線只是一個常見的默認值。

臨時文件也是一個位,它可以很容易地避免了疣。

${COMPILE_PATH}/%.c.d:%.cpp 
    $(CC) $(CFLAGS) ${CFLAGS_NDBG} -MM -E $^ \ 
    | sed 's|.*\.o|$(dir [email protected])/&|g' >[email protected] 

(我猜g標誌居然還完全是多餘的在這裏。)

+0

我最初打算* *強烈建議使用其它分隔像這樣但在目錄路徑逃避斜線的背景實際上是更安全的。它們不能出現在目錄組件路徑中,但幾乎每個其他字符/字節都可以。所以我淡化了一下。 –