Как использовать sed в Makefile - PullRequest
20 голосов
/ 29 июня 2010

Я попытался добавить в свой Makefile следующее:

@if [ $(DEMO) -eq 0 ]; then \
    cat sys.conf | sed -e "s#^public_demo[\s=].*$#public_demo=0#" >sys.conf.temp; \
else \
    cat sys.conf | sed -e "s#^public_demo[\s=].*$#public_demo=1#" >sys.conf.temp; \
fi

но когда я запускаю make , я получаю следующую ошибку:

sed: -e expression #1, char 30: unterminated `s' command

Если я запускаю в консоли точные строки, содержащие sed, они ведут себя правильно.

Почему я получаю эту ошибку и как ее можно исправить?

Ответы [ 6 ]

27 голосов
/ 29 июня 2010

Это может быть знак $ в подстановке, который интерпретируется make как переменная.Попробуйте использовать два из них, например . * $$ # public_demo .Затем make расширит это до одного $.

РЕДАКТИРОВАТЬ: Это был только половина ответа.Как ответил кристис: другая часть заключается в том, что нужно использовать одинарные кавычки, чтобы bash тоже не расширил знак $.

7 голосов
/ 29 июня 2010

Я предлагаю вам использовать одинарные кавычки вместо двойных кавычек, $ может быть обработан как специальный символ по make перед запуском sed:

cat sys.conf | sed -e 's#^public_demo[\s=].*$#public_demo=0#' >sys.conf.temp;
3 голосов
/ 15 января 2014

Версия make в моей машине:

$ make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-redhat-linux-gnu

И sed версия:

$ sed --version
GNU sed version 4.2.1

Я должен добавить обратную косую черту для $, чтобы sed не воспринимал ее как конец строки:

cat sys.conf | sed -e 's#^public_demo[\s=].*\$$#public_demo=0#' >sys.conf.temp
1 голос
/ 06 июня 2017

Я попробовал двойной знак $$, но в моей проблеме это не сработало, возможно, $$$$ или $$$$$$$$ сработало бы, потому что мой Makefile вызывает другие Makefile и так далее. Но я нашел лучшее решение:

Создайте файл оболочки replacer.sh в той же папке, что и ваш Makefile, который выполняет команду sed. Дайте ему исполняемый бит с

chmod +x replacer.sh

Теперь вы можете вызвать этот файл в вашем Makefile:

./replacer.sh
0 голосов
/ 30 января 2015

Одна проблема, с которой я столкнулся при использовании sed в make-файле, не решается текущими ответами, поэтому я объясню это здесь.Я заполнял переменные Bash примерно так: remote_owner=$$($(MAKE) remote.owner) и затем использовал эти переменные в моей подстановке sed.проблема в том, что из-за запутанного способа установки моих правил remote_owner может иметь собственный вывод make, что дает мне ошибку:

sed: -e expression #1, char 69: unknown option to `s'
make: *** [alter_table_local.sql] Error 1

Например, добавляя сообщения отладки, я нашел local_ownerустановите значение:

make[1]: Entering directory `/home/jcomeau/rentacoder/jh'
jcomeau

. Ответом было добавить параметр --silent, чтобы сделать: remote_owner=$$($(MAKE) --silent remote.owner)

0 голосов
/ 29 июня 2010

Используйте что-то другое, чем # для разделения частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...