使用するときMK、GNU sed、変数がまったく拡張されていないことがわかりました。
問題のコード:
VAR=qux
...
build:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
これは以下を実行しているようです:
sed -i "s|FOO = .*|FOO = $VAR|" bar.file
実行したいとき
sed -i "s|FOO = .*|FOO = qux|" bar.file
他のスタック交換の記事で述べたように、一重引用符と二重引用符を使用してみました。拡張できる唯一のケース$VAR
は、周囲に引用符がない場合です。これはもちろん、sed
表現がもはや表現と見なされないことを意味します。
答え1
これはMakefileの一部のように見えます。
ファイルには2つのエラーがあります。
置換コマンドは区切り記号として
sed
使用されますが、|
中間区切り記号はです/
。Makefile変数はORedではなく逆参照
VAR
されます。$VAR
$(VAR)
${VAR}
Makefileはシェルスクリプトではありません。したがって、次のMakefileは完全に有効で、qux world
端末から出力として文字列を生成します。
VAR= qux
build:
@echo 'hello world' | sed 's|hello|$(VAR)|'
Unix Makefileでは、$VAR
変数の値に展開され、V
その後に文字が続きますAR
。特に明記しない限り、変数名は単一文字であるためです。複数文字の変数名がある場合は、フルネームを$(...)
またはで囲む必要があります${...}
。
明らかにPlan9 Makefileはこの点で異なる場合があります。
修正する:
2.0を使用している場合、次はmkfile
正しい値を出力します。mk
hello = qux
VAR=qux
all:
echo "hello = bar" | sed "s/= bar/= $VAR/"
だから質問の引用が私に合うようです。
答え2
以前はエスケープしようとしましたが、誤って次のように二重引用符を入れました。
sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file
それに変える
sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file
働く