2017-02-12 2 views
0

私は以下のようにmakefileにsedを使用しようとしています。しかし、それは修正されたファイルを生成していないようです。私はシェルでsedコマンドを試して、それが動作することを確認しました。メイクファイルで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 

私が間違っていることはありますか?あなたが期待するwhst

+0

私はメイクツールではないかもしれないと思いますこのために使用する。 Makeは、ファイルを出力ファイルに変換する方法を記述するために使用されます。 ana:出力が入力ファイルに明確に結びついていない。シンプルなbashスクリプトはうまくいくはずです。 bashスクリプトをいつ実行するかを教えるためにmakeを関与させたいが、ループロジックを作るためにmakeをmangleしないでください。 makeは次のように読むべきです:anaはx yとyに依存します。どのようにx yとzを取ってそれらからanaを作るかがあります。 –

+1

2つのsedコマンドを1つにマージすることができます: 'sed -e"/STF1/$$ ana1/g "-e"/STF2/$$ ana2/g "./planalysis/src/analysis.arr> ./計画/ src/spanalysis.arr'。これにより、パフォーマンスが改善され、2番目の 'sed'呼び出しで入力ストリームを上書きする問題を解決します。 –

答えて

3

このコマンドはしないだろう。

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

かかわらず、あなたがMakefileでたり、シェルでそれを実行するかどうかの。

あなたは

some-command my.file > my.file 

を実行した場合のリダイレクトは、コマンドが実行される前に設定されているので、あなたは関係なく、コマンドの、空my.fileで終わる可能性が高いです。シェルがリダイレクト> my.fileを実行するとすぐに、そのファイルは空になります。なぜなら、これは出力のリダイレクトがするためです。コマンドが最終的に実行され、my.fileの読み取りを試みると、ファイルが空であることがわかります。 sedや他の多くのコマンドの場合、空の入力は空の出力を生成し、私はそれがあなたが見ているものだと思います。

単一sedの呼び出しに編集を組み合わせて、コメントに@AlexeySemenyukにより示唆されるように、一時ファイルを使用するか、sed -iを使用する(man sedを参照)または:

sed -e "s/STF1/$$ana1/g" -e "s/STF2/$$ana2/g" \ 
    ./planalysis/src/analysis.arr > ./planalysis/src/spanalysis.arr 
関連する問題