Unix 在Makefile中使用sed

Unix 在Makefile中使用sed,unix,sed,makefile,Unix,Sed,Makefile,我试图使每个子目录(存储在变量SUBDIRS中)中的文件(conf.py)的文本块被删除。此文本块位于标记#--Begin和#--End中。请参阅下面的代码示例。为了保持整洁,并且不必在makefile中运行额外的shell脚本,我想在makefile中使用sed命令,但在这样做时遇到了麻烦。我在其他论坛的帖子上找不到解决这个问题的方法,因此我将非常感谢您的帮助 .PHONY $(SUBDIRS) SUBDIRS = (list of all subdirectories that contai

我试图使每个子目录(存储在变量
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  
此命令不会产生任何结果


谢谢

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

有两种方法可以解决这个问题。一种是使用 要强制每次运行命令,请执行以下操作:

.PHONY: $(SUBDIRS)
$(SUBDIRS):
    sed .....
另一种方法是为文件的编辑版本和未编辑版本指定不同的名称,例如
conf.py
conf.py.in
,并使用以下名称使第一个版本依赖于第二个版本:

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

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

在将其合并到makefile之前,您应该在命令行上测试
sed
命令。在编写时,它会删除您希望它删除的行,然后将结果定向到stdout。要就地修改文件,应使用
-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
命令之前,请确保此功能正常工作。

首先为没有包含
.PHONY
表示歉意。事实上,我在发布之前已经有了这个。此问题已更新为包含此感谢。这太令人沮丧了。只需要添加-i选项
$(SUBDIRS):
    @echo attempting to act on $@
    @ls Docs/$@/conf.py