仅用 envsubst 替换特定变量

Joã*_*elo 81 shell environment-variables

我正在尝试通过 执行环境变量替换envsubst,但我只想替换特定变量。

从文档中,我应该能够告诉envsubst只替换某些变量,但我无法做到这一点。

例如,如果我有一个包含以下内容的文件:

VAR_1=${VAR_1}
VAR_2=${VAR_2}
Run Code Online (Sandbox Code Playgroud)

我应该如何执行envsubst以便它只替换对 的引用${VAR_1}

don*_*sti 247

根据手册页:

envsubst [OPTION] [SHELL-FORMAT]
Run Code Online (Sandbox Code Playgroud)

如果给出了 SHELL-FORMAT,则仅替换 SHELL-FORMAT 中引用的那些环境变量;否则,将替换标准输入中出现的所有环境变量引用。

其中 SHELL-FORMAT 字符串是“引用表单中的 shell 变量的字符串$variable${variable}[...]忽略了。” .
因此,必须将各自的变量名称传递envsubst给 shell 格式的字符串(显然,它们需要被转义/引用以便按字面传递给envsubst)。例子:

输入文件例如infile

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}
Run Code Online (Sandbox Code Playgroud)

和一些值,如

export  VAR1="one" VAR2="two" VAR3="three"
Run Code Online (Sandbox Code Playgroud)

然后运行

envsubst '${VAR1} ${VAR3}' <infile
Run Code Online (Sandbox Code Playgroud)

或者

envsubst '${VAR1},${VAR3}' <infile
Run Code Online (Sandbox Code Playgroud)

或者

envsubst '${VAR1}
${VAR3}' <infile
Run Code Online (Sandbox Code Playgroud)

产出

VAR1=one
VAR2=${VAR2}
VAR3=three
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢反斜杠:

envsubst \$VAR1,\$VAR2 <infile
Run Code Online (Sandbox Code Playgroud)

产生

VAR1=one
VAR2=two
VAR3=${VAR3}
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不是公认的答案? (32认同)
  • 是的,这是正确的答案! (9认同)
  • 如果您知道用于限制可替换变量的变量前缀:`envsubst "$(printf '${%s} ' ${!PREFIX*})" &lt; infile` (8认同)
  • 或者,如果您在 `SUBST_VARS` 中有它们的列表,则: `envsubst "$(printf '${%s} ' $SUBST_VARS)" &lt; infile` (5认同)

Rui*_*iro 0

在调用之前,envsubst您应该使用单引号导出来恢复VAR_1修改。如:

export VAR_1='somevalue'
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请参阅:

如何替换复杂文本文件中的 shell 变量

  • 正确答案如下 (52认同)
  • @Craig 堆栈溢出没有“下面” - 答案根据各种因素改变顺序。请链接到实际答案。 (7认同)