2017-02-06 8 views
0

У меня есть файл с некоторыми include строк, и я хотел бы прочитать путь к файлу и заменить эту строку содержимым файла.Как заменить строку другим содержимым файла в Makefile

например. замените строку <!-- include(path/filename.txt) --> с содержанием path/filename.txt

# meta info 
- a 
- b 

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

Мой Makefile:

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

Захват группы выглядит получить пустой $$1 и сценарий зависает. Я что-то пропустил?

Update: Remove $ (скорлупа)

+0

во-первых, рецепт запускается оболочкой в ​​любом случае, так почему бы вам нужно '$ (SHELL ...)'? во-вторых, '$ 1' пуст, потому что оболочка расширяет его, потому что находится внутри строки с двумя кавычками (подставляя значение первого позиционного параметра, который пуст). также, если я помню что-нибудь о Perl (что я не обязательно, заметьте), вы хотите использовать '\ 1', чтобы ссылаться на« регистр соответствия №1 »-' 'cat $$ 1'' заменит содержимое файла с именем '$ 1' (которое, чтобы повторить, является пустой строкой), не уверен, что там идея. –

+0

Почему вы используете 'cat $$ 1', тогда как с опцией' -i' в ** Perl ** изменить на месте? –

+0

Спасибо за @MichaelLivshin и @ k-five. Я хотел бы заменить строку соответствующим содержимым файла, поэтому требуется опция -i. Я пробовал какое-то время, и найти e-модификатор - это именно то, что мне нужно. '' 'perl -pi -e 's/ /' cat $$ 1'/e' input.txt '' ' –

ответ

0

Следующий синтаксис работает хорошо.

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