Sed

mk、sed 和嵌入環境變數

  • August 21, 2017

使用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不再將表達式視為表達式。

事實證明,雖然我之前嘗試過轉義它,但我錯誤地在它周圍加上了雙引號,如下所示:

sed -i 's|FOO = .*|FOO = '"$VAR"'|' bar.file

將其更改為

sed -i 's|FOO = .*|FOO = '$VAR'|' bar.file

作品。

這看起來像 Makefile 中的一個片段。

文件中有兩個錯誤:

  1. sed替換命令|用作分隔符,但中間分隔符是/.
  2. Makefile 變數VAR被取消引用,$VAR而不是$(VAR)or ${VAR}

請注意,Makefile 不是 shell 腳本。因此,以下 Makefile 完全有效,並將qux world在終端上生成字元串作為輸出:

VAR=    qux                                        

build:                                             
       @echo 'hello world' | sed 's|hello|$(VAR)|' 

在 Unix Makefile 中,將擴展為後跟字母$VAR的變數的值。這是因為除非另有說明,否則變數的名稱是單個字元。如果您有多字元變數名稱,則必須將整個名稱括在或中。V``AR``$(...)``${...}

顯然,Plan9 Makefiles 在這方面可能有所不同。


更新:

以下mkfile在使用mk2.0 時輸出正確的值,hello = qux

VAR=qux

all:
       echo "hello = bar" | sed "s/= bar/= $VAR/"

所以問題中的引用對我來說似乎是正確的。

引用自:https://unix.stackexchange.com/questions/387217