Bash

sed 與外部腳本文件 - 如何應用 shell 變數?

  • March 15, 2021

直接在命令行上,這有效:

$sed "s/a/X/;s/X/&a&/" file

使用 shell 變數也是如此:

$varin=a ; varout=X ; sed "s/$varin/$varout/;s/$varout/&$varin&/" file

但是使用外部腳本文件

$sed -f script.sed file

只有“硬編碼”方法有效

$cat script.sed
s/a/X/
s/X/&a&/

雖然 shell 變數沒有展開

$cat script.sed
s/$varin/$varout/
a/$varout/&$varin&/

$varin=a ; varout=X ; sed -f script.sed file
#-> variables in script.sed not interpreted; output unchanged

如何在外部sed腳本文件中實現對shell變數的解釋?

我很明白它sed本身不能解釋 shell 變數,但是我如何預處理腳本(以保存方式)以執行它來bash解析變數?也許可以在一開始就使用命令將它們導入sed

以下方法沒有成效(使用bash):

  • 使用export varin=a ; export varout=X
  • via sed -e $(cat sed.script) file:適用於單行腳本,在多行腳本上失敗,即使將註釋作為第一行
  • sed -f <(cat script.sed) file
  • eval sed -f script.sed file

您可以envsubst在執行之前使用預期值替換腳本中的變數sed

$ cat script.sed
s/$varin/$varout/
s/$varout/&$varin&/

用它們的變數值替換字元串$varinor${varin}$varoutor ${varout}in :script.sed

$ varin='a' varout='X' envsubst '$varin $varout' <script.sed
s/a/X/
s/X/&a&/

sed使用程序替換的命令:

sed -f <(varin='a' varout='X' envsubst '$varin $varout' <script.sed) file

Heredoc救援:

varin=a; varout=X
sed -f - <<_CODE_    file
s/$varin/$varout/
_CODE_

但是請注意,如果外殼變數在沒有經過適當消毒的情況下被降落在內部,那麼這種方法充滿了錯誤/不正確的結果。舉個例子,如果 varout 包含字元等會發生&什麼/

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