【问题标题】:Using sed in a Makefile在 Makefile 中使用 sed
【发布时间】:2012-07-24 15:44:24
【问题描述】:

我正在尝试删除每个子目录(存储在变量SUBDIRS)中的文件文本块(conf.py)。此文本块位于标签#--Begin#--End 内。请参阅下面的代码示例。为了整洁并且不必从makefile中运行额外的shell脚本,我想在makefile中使用sed命令,但是这样做有困难。我在任何其他论坛帖子上都找不到解决方案,因此我们将不胜感激。

.PHONY $(SUBDIRS)
SUBDIRS = (list of all subdirectories that contain a relevant conf.py)
$(SUBDIRS):  
    sed '/#--Begin/,/#--End/d' Docs/$@/conf.py  

这个命令没有任何反应。

谢谢!

【问题讨论】:

    标签: unix sed makefile


    【解决方案1】:

    您应该在将sed 命令并入makefile 之前在命令行上对其进行测试。正如所写的那样,它删除了您希望它删除的行 - 然后将结果定向到标准输出。要修改文件,您应该使用-i

    sed -i -e '/#--Begin/,/#--End/d' Docs/$@/conf.py
    

    很可能还有其他问题。您还没有向我们展示真正的 makefile(.PHONY $(SUBDIRS) 是不合法的,因此您没有粘贴工作的 makefile 的一部分),但是该规则甚至可能没有按照您认为的方式执行。试试这个:

    $(SUBDIRS):
        @echo attempting to act on $@
        @ls Docs/$@/conf.py
    

    在尝试引入sed 命令之前,让它完美地工作

    【讨论】:

    • 谢谢。这很令人沮丧。只需添加 -i 选项
    【解决方案2】:

    您的规则使用 SUBDIRS 列表作为其目标。 Make 看看这些是否存在,它们当然存在。它们不依赖于其他任何东西,所以它们是最新的,所以 Make 不需要做任何事情。

    有两种方法可以解决这个问题。一种是使用Phony Target 强制命令每次运行:

    .PHONY: $(SUBDIRS)
    $(SUBDIRS):
        sed .....
    

    另一种方法是为文件的编辑和未编辑版本赋予不同的名称,例如conf.pyconf.py.in,并使用 Pattern Rule 使第一个依赖于第二个:

    $(SUBDIRS): Docs/%/conf.py: Docs/%/conf.py.in
       sed '/#--Begin/,/#--End/d' $< >$@
    

    这样更好,因为它会在输入文件更改时自动运行。

    【讨论】:

    • 首先很抱歉没有包含.PHONY。事实上,我在发布之前已经有了这个。该问题已更新为包含此
    猜你喜欢
    • 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
    相关资源
    最近更新 更多