2017-02-06 1 views
0

ファイルがありますが、ファイルパスはincludeとなり、ファイルの内容を読み替えてファイルの内容に置き換えます。文字列をMakefileの他のファイルコンテンツで置き換える方法

path/filename.txt

# meta info 
- a 
- b 

# included files 
<!-- include(path/filename.txt) --> 

私のMakefileの内容に沿っ<!-- include(path/filename.txt) -->を置き換える:

expand-includes: 
    @echo "Expand all included file" 
    perl -pi -e "s/<!--\s?include\((.+)\)\s?-->/`cat $$1`/" input.txt 

キャプチャグループは$$1空の取得に見える、スクリプトがハングアップします。 私は何かが恋しいですか?

アップデート: 次の構文がうまく機能$(シェル)

+0

まず、レシピはとにかくシェルによって実行されるので、なぜあなたは '' $(シェル...)が必要ですか?第2に、シェルが二重引用符で囲まれた文字列の中にあるため(名前が空の最初の位置パラメータの値を代入するため)、シェルが展開するので '$ 1'は空です。また、もし私がPerlについて何かを覚えていれば(必ずしもそうではありませんが)、 "\ 1"を使って "match register#1"を参照したいと思っています - '' cat $$ 1''は、 '$ 1'で指定されたファイルの内容(繰り返すために、空の文字列です)、そこに何があるのか​​分かりません。 –

+0

なぜ 'cat $$ 1'を使うのですか?** Perl **の' -i'オプションを使ってインプレースを変更するのはなぜですか? –

+0

@MichaelLivshinと@ k-fiveに感謝します。文字列を対応するファイルの内容に置き換えて、 '-i'オプションが必要です。私はしばらく試してみて、e修飾子が私が必要とするものであることを見いだします。 '' 'perl -pi -e ''/<! - \ s?include \((。+ \。md)\)\ s? - > /' cat $$ 1'/e 'input.txt '' '' –

答えて

0

を削除します。

perl -p -e 's/<!--\s?include\((.+)\)\s?-->/`cat $$1`/e' input.txt > output.txt

関連する問題