2017-02-12 169 views
0

我想在makefile中使用sed,如下所示。但它似乎並沒有產生修改後的文件。我已經嘗試了shell中的sed命令並確保它可以正常工作。在makefile中使用sed

ana: 
    -for ana1 in $(anas) ; do \ 
     for ana2 in $(anas) ; do \ 
      sed "s/STF1/$$ana1/g" ./planalysis/src/analysis.arr > ./planalysis/src/spanalysis.arr ; \ 
      sed "s/STF2/$$ana2/g" ./planalysis/src/spanalysis.arr > ./planalysis/src/spanalysis.arr ; \ 
      # ... perform some analysis with the modified file.. 
      # ... 
     done \ 
    done 

有什麼我做錯了嗎?

+0

我認爲,讓可能不是工具爲此使用。 Make用於描述如何將文件或文件轉換爲輸出文件。 ana:輸出與任何輸入文件都沒有明確關聯。一個簡單的bash腳本應該適用於此。如果你想讓make來告訴什麼時候運行bash腳本,那麼這樣做,但不要破壞邏輯循環。 Make應該像這樣讀取:ana依賴於x y和y。有你如何把x和z和從他們做出ana。 –

+1

您可以將兩個sed命令合併爲一個:'sed -e「s/STF1/$$ ana1/g」-e「s/STF2/$$ ana2/g」./planalysis/src/analysis.arr> ./ planalysis/src目錄/ spanalysis.arr'。這將改善性能並解決在第二次sed調用中覆蓋輸入流的問題。 –

回答

3

這個命令不會做WHST你期望:

sed "s/STF2/$$ana2/g" ./planalysis/src/spanalysis.arr > ./planalysis/src/spanalysis.arr ; 

無論你在一個Makefile或在shell執行它的。

如果執行

some-command my.file > my.file 

你很可能有一個空my.file結束了,無論命令,因爲重定向的命令執行之前成立。只要shell執行重定向> my.file,該文件就清空了,因爲這就是輸出重定向的功能。當命令最終執行並嘗試讀取my.file時,它會發現文件爲空。在sed和其他許多命令的情況下,一個空輸入會產生一個空輸出,並且我認爲這就是您所看到的。

使用臨時文件,或者使用sed -i(見man sed),或者由@AlexeySemenyuk在評論所說,所做的編輯合併成一個單一的SED調用:

sed -e "s/STF1/$$ana1/g" -e "s/STF2/$$ana2/g" \ 
    ./planalysis/src/analysis.arr > ./planalysis/src/spanalysis.arr