Я сделал обширный поиск и нашел много похожих вопросов, но не нашел того, что действительно делало то, что я хотел, насколько я мог судить.Использование 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
Неясно, что вы имеете в виду "не с текстом $ {} BAR". Связанный с вами вопрос показывает в значительной степени то, о чем я думаю, о чем вы спрашиваете. 'sed 's ~ foo ~' $ {BAR} '~ g'' должен работать ... –
@ l'L'l Нет, он не должен, $ {BAR} может содержать тильды, пробелы или вкладки, все из-за чего ваша замена завершится неудачей. – Jens
Покажите нам свой файл Makefile, особенно назначение BAR и целевое/правило, в котором вы используете sed. Опишите полученный текст и ожидаемый результат. – Jens