2016-12-22 3 views
1

Я все-таки ответил на все возможные ответы в SO, но все же я не могу заставить работать мой скрипт.Заменить переменную в sed внутри Makefile

У меня есть сценарий запроса в SPARQL с линией, которая должна заменить знак % вкладчик% по переменной между "<>"

?link dcterms:contributor %contributor% 

В

?link dcterms:contributor <http://newurl> 

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

for l in `cat sref.csv`; do \ 
    QUERY=$$(cat queries/table_knowledge.rq | sed "[email protected]%contributor%@<$$l>@g") ; \ 
    echo $$QUERY ; \ 
done 

Кроме того, как это не работает:

QUERY=$$(cat queries/table_knowledge.rq | sed 's/%contributor%/<$(l)>/g') ; \ 

или

QUERY=$$(cat queries/table_knowledge.rq | sed 's/%contributor%/<${l}>/g') ; \ 
+0

Во-первых, "Я не удается сделать это" не является полезный отчет о проблеме. Что именно происходит? Что делает печать? Вы видите кучу пустых строк? Нет выхода? Удалите/вставьте результаты. Ваша первая версия выглядит правильно для меня (вторая или третья версии не могут работать, потому что вы используете '' 'quoting, и вы используете ссылки на переменные, но вы пытаетесь получить доступ к переменным оболочки. Если вы все еще застряли, я рекомендую добавить 'set -x;' перед 'for l ...', чтобы оболочка печатала команды, которые она пытается вызвать. – MadScientist

ответ

2

Используйте двойные кавычки, так что СЭД расширит переменные.
Используйте разделитель, отличный от /, так как замена содержит /

QUERY=$(cat queries/table_knowledge.rq | sed "s|%contributor%|<${l}>|g") ;

Тест:

$ test="http://test.com" 
$ echo "?link dcterms:contributor %contributor%" > source.file 
$ x=$(cat source.file|sed "s|%contributor%|<${test}>|g") 
$ echo $x 
?link dcterms:contributor <http://test.com> 
+0

В первой версии в вопросе используются двойные кавычки. Также первая версия использует '@' как разделитель, а не '/'. В этом вопросе говорится, что он работает из оболочки, которую вы просто повторяете здесь. Проблема в том, что она не работает из рецепта make-файла. – MadScientist

Смежные вопросы