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