【问题标题】:Using sed in makefile在 makefile 中使用 sed
【发布时间】:2017-02-12 04:45:15
【问题描述】:

我正在尝试在 makefile 中使用 sed,如下所示。但它似乎不会产生修改后的文件。我已经在 shell 中尝试了 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

是不是我做错了什么?

【问题讨论】:

  • 我认为 make 可能不是用于此目的的工具。 Make 用于描述如何将一个或多个文件转换为输出文件。 ana: 输出没有明确地与任何输入文件相关联。一个简单的 bash 脚本应该可以正常工作。如果您想让 make 告诉何时运行 bash 脚本,那么就这样做,但不要破坏 make 来执行循环逻辑。 Make 应该是这样的:ana 依赖于 x y 和 y。您可以使用 x y 和 z 并从中制作 ana。
  • 您可以将两个 sed 命令合并为一个:sed -e "s/STF1/$$ana1/g" -e "s/STF2/$$ana2/g" ./planalysis/src/analysis.arr > ./planalysis/src/spanalysis.arr。这将提高性能并解决在您的第二个 sed 调用中覆盖输入流的问题。

标签: bash for-loop sed makefile gnu-make


【解决方案1】:

这个命令不会如你所愿:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 2017-06-06
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多