2016-11-08 8 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>は入力 "このファイルの\ nを$$(猫の入力)を編集しないでください"

EDIT:$(cat input)を使用して、この方法ことを指摘してマッドサイエンティストにおかげで( )は信頼できません。

+0

sedコマンドを実行するとエラーが表示されます。sed:読み取り不可1 {h; s /.*/ NEW FIRST LINE /; G;}:このようなファイルまたはディレクトリはありません。 – ManiAm

+0

2番目の例は一般的には機能しません。 'cat input'コマンドを実行する前後に、リダイレクトが起こるかどうかは不明です(' input'を空のファイルに切り捨てる)。また、これは非効率的です( 'input'が常に小さいと分からない限り)。' echo -e'は移植性がありません。それを行う唯一の安全な方法は一時ファイルです: 'echo 'このファイルを編集しないでください' >入力$$$$; cat入力>>入力$$$$; mv -f入力$$$$入力 ' – MadScientist

+0

@ManiAm:どのバージョンのsedを使用していますか?' sed '{h; s /.*/New FIRST LINE /; G;}コマンドラインで 'input'を実行し、それが動作するかどうかを確認してください。 – Beta

0

file機能は、4.2のようにもファイル

から改行を読み取ることができる、4.0になるように添加して、少しハックですが、これだけでメイクを行うことができます。

define n 


endef 

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

(OSX 10.12に付属しているsedでは受け入れられた答えがうまくいきませんでしたが、makeはファイル操作オプションとしては古すぎました)、私は次の(醜い)解決策を解決しました:

echo "DATA-Line-1" > line.tmp 
mv input input.tmp 
cat line.tmp input.tmp > input 
rm input.tmp line.tmp 
関連する問題