mk、sed、および組み込み環境変数[閉じる]

mk、sed、および組み込み環境変数[閉じる]

使用するとき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つのエラーがあります。

  1. 置換コマンドは区切り記号としてsed使用されますが、|中間区切り記号はです/

  2. 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正しい値を出力します。mkhello = 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

働く

関連情報