2017-02-12 25 views
0

Я пытаюсь использовать sed в make-файле, как показано ниже. Но он, похоже, не создает измененный файл. Я попробовал команду sed в оболочке и удостоверился, что она работает.Использование sed в makefile

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 make для логики цикла. Make должен выглядеть следующим образом: ana зависит от x y и y. Существует так, как вы принимаете x y и 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 или в оболочке.

При выполнении

some-command my.file > my.file 

Вы, вероятно, в конечном итоге с пустой my.file, независимо от команды, потому что переназначения настроены перед выполнением команды. Как только оболочка выполняет перенаправление > 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