2017-02-12 161 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