2017-01-22 3 views
0

Я сделал обширный поиск и нашел много похожих вопросов, но не нашел того, что действительно делало то, что я хотел, насколько я мог судить.Использование sed в Makefile для замены чего-либо с помощью переменной

Вот ближайший вопрос: Using sed in a makefile; how to escape variables?

очень упрощенная версия того, что я хочу сделать внутри Makefile является

sed s~foo~${BAR}~ 

где $BAR переменная в моей Makefile. Очевидно, я хочу заменить foo значением из $BAR не с текстом ${BAR} как в настоящее время.

С момента его запроса, вот полная версия:
Примечание. Цель состоит в том, чтобы Makefile был POSIX.

Makefile (релевантно только часть):

... 
diff: 
    scripts/build/diff-all.sh 
... 

скрипты/строить/diff-all.sh

#!/bin/bash -e 

for DIFFBRANCH in $(cat diff-branches); do 
    scripts/build/diff.sh $DIFFBRANCH 
done 

Diff-ветви

2016_reorg_diff 
# more branches here 

скрипты/строить/диф. sh

#/bin/bash -e 

DIFFBRANCH=$1 
BRANCH=$(git rev-parse --abbrev-ref HEAD) 
CHAPTERDIR=src/chapters 
SHORTCHAPTERDIR=${CHAPTERDIR##src/} # remove src/ from the start of CHAPTERDIR 
CHAPTERS=$(ls $CHAPTERDIR | grep "^\\d\\d_.*\\.tex$") 

LATEXARGS="-file-line-error -halt-on-error" 

if [[ ! $DIFFBRANCH ]]; then 
    echo "usage: $0 DIFFBRANCH" 
    exit 1 
fi 

mkdir -p tmp 
mkdir -p pdf 

for CHAPTER in $CHAPTERS; do # make tex diff files for each chapter 
    SLUG=$(echo $CHAPTER | cut -f 1 -d '.') 
    latexdiff-vc --git --so --flatten --force -r $DIFFBRANCH -r $BRANCH $CHAPTERDIR/$CHAPTER 
    mkdir -p tmp/$CHAPTERDIR 
    mv -v $CHAPTERDIR/$SLUG-diff$DIFFBRANCH-$BRANCH.tex tmp/src_diff_$DIFFBRANCH/$SHORTCHAPTERDIR/$SLUG-$BRANCH-diff-$DIFFBRANCH.tex 
done 

rsync -avz --exclude $SHORTCHAPTERDIR src/ tmp/src_diff_$DIFFBRANCH/ # copy all source files to tmp except chapters (because they're already there) 

sed -i.bak -E 's~^([[:blank:]]*\subimport{chapters/}{[[:alnum:]_]+)}~\1-$BRANCH-diff-$DIFFBRANCH}~' tmp/src_diff_$DIFFBRANCH/iuf-rulebook.tex 
# this replaces \subimport{chapters/}{01_general} with \subimport{chapters/}{01_general-$BRANCH-diff-$DIFFBRANCH} with the variables expanded 
# so that the iuf-rulebook.tex uses the diffed chapters 
# the -i.bak is required so SED works on OSX and Linux 
rm -f tmp/src_diff_$DIFFBRANCH/*.bak # because of this, we have to delete the .bak files after 


mkdir -p tmp/out_diff_$DIFFBRANCH 
TEXINPUTS=tmp/src_diff_$DIFFBRANCH: latexmk -pdf $LATEXARGS -quiet -output-directory=./tmp/out_diff_$DIFFBRANCH tmp/src_diff_$DIFFBRANCH/iuf-rulebook.tex 
mv tmp/out_diff_$DIFFBRANCH/iuf-rulebook.pdf pdf/iuf-rulebook-$BRANCH-diff-$DIFFBRANCH.pdf 
rm -rf tmp/*_$DIFFBRANCH 
+2

Неясно, что вы имеете в виду "не с текстом $ {} BAR". Связанный с вами вопрос показывает в значительной степени то, о чем я думаю, о чем вы спрашиваете. 'sed 's ~ foo ~' $ {BAR} '~ g'' должен работать ... –

+0

@ l'L'l Нет, он не должен, $ {BAR} может содержать тильды, пробелы или вкладки, все из-за чего ваша замена завершится неудачей. – Jens

+0

Покажите нам свой файл Makefile, особенно назначение BAR и целевое/правило, в котором вы используете sed. Опишите полученный текст и ожидаемый результат. – Jens

ответ

0

Команда:

sed -e s/number/$(BAR)/g 

Для проверки:

VAR = random number 
VAR1 = file 
FOO = $(VAR) 
$(info before substitution: $(FOO)) 
FOO = $(shell echo $(VAR) | sed -e s/number/$(VAR1)/g) 
$(info after substitution: $(FOO))