2016-11-08 70 views
1

我正在尝试使用Makefile将文本预先挂接到文件。在终端下面的bash命令作品:将文本添加到Makefile中的文件

echo -e "DATA-Line-1\n$(cat input)" > input 

但是,当我把上面的命令在一个Makefile,这是行不通的:

copyHeader: 
    @echo -e "DO NOT EDIT THIS FILE \n$(cat input)" > input 

我猜$(猫输入)不按预期工作在Makefile中。

回答

3

我推荐sed将一行文本前置到一个文件中。 i命令是一种痛苦;一些聪明的使用保留空间的做同样的事情在一个更复杂,但不太麻烦的方式:

copyHeader: 
    sed -i "" '1{h;s/.*/NEW FIRST LINE/;G;}' input 

但是,如果你想要做你的方式,我认为一个额外的“$”就可以了:

copyHeader:
@echo -e “DO NOT EDIT THIS档案\ n $$(猫输入)”>输入

编辑:由于MadScientist用于指出该方法(使用$(cat input) )是不可靠的。

+0

sed命令给我错误:sed:无法读取1 {h; s /.*/ NEW FIRST LINE /; G;}:没有这样的文件或目录 – ManiAm

+0

第二个示例无法正常工作。在运行'cat input'命令之前或之后,重定向是否会发生(导致'input'被截断为空文件)是未定义的。此外,这是一种低效率的方法(除非你知道'input'总是很小,而'echo -e'不是可移植的,唯一安全的方法是使用临时文件:'echo'不要编辑这个文件' > input。$$$$; cat input >> input。$$$$; mv -f input。$$$$ input' – MadScientist

+0

@ManiAm:你正在使用哪个版本的sed?试试'sed'1 {h; s /.*/ NEW FIRST LINE /; G;}'input'命令行,看看它是否有效,我们可以从那里开始 – Beta

0

添加了一个file功能在4.0,它是4.2也可以从文件

换行符是有点哈克但可以用make单独完成读作:

define n 


endef 

copyHeader: 
    $(file > input,DATA-Line-1$n$(file < input)) 
0

经过一段时间的干扰之后(接受的答案不适用于OSX 10.12附带的sed,因为文件操作选项太旧),我决定采用以下(丑陋)解决方案:

echo "DATA-Line-1" > line.tmp 
mv input input.tmp 
cat line.tmp input.tmp > input 
rm input.tmp line.tmp