我想以某种方式导出一个文件(其中包含环境变量引用)并替换实际值。这是我尝试过的,但如您所见,它不起作用。有什么想法吗?
-bash-3.00$ cat vars_file
${MY_VAR}
-bash-3.00$ export MY_VAR=MY_VALUE; cat ./vars_file | xargs echo
${MY_VAR}
答案1
旧线程,但这是一个反复出现的问题。以下是使用 bash 的解决方案mapfile
:
mateus@mateus:/tmp$ cat input.txt
a = $a
b = $b
mateus@mateus:/tmp$ echo a=$a, b=$b
a=1, b=2
mateus@mateus:/tmp$ function subst() { eval echo -E "$2"; }
mateus@mateus:/tmp$ mapfile -c 1 -C subst < input.txt
a = 1
b = 2
bash 内置函数在从输入文件读取的每一行上mapfile
调用用户定义函数subst
(参见 -C/-c 选项)input.txt
。由于该行包含未转义的文本,因此eval
使用它来评估它并将echo
转换后的文本输出到 stdout(-E 避免解释特殊字符)。
恕我直言,这比任何基于 sed/awk/perl/regex 的解决方案都要优雅得多。
另一个可能的解决方案是使用 shell 自己的替换。这看起来是一种更“便携”的方式,不需要依赖mapfile
:
mateus@mateus:/tmp$ EOF=EOF_$RANDOM; eval echo "\"$(cat <<$EOF
$(<input.txt)
$EOF
)\""
a = 1
b = 2
注意我们用来$EOF
最小化 cat 的 here-document 与 input.txt 内容冲突。
两个例子均来自:https://gist.github.com/4288846
编辑:抱歉,第一个示例没有正确处理注释和空格。我会处理这个问题并发布解决方案。 EDIT2:修复双重 $RANDOM 评估
答案2
正如在同一个帖子中所述http://www.issociate.de/board/post/281806/sed_replace_by_enviroment_var_content.html,“正确”的解决方案如下:
awk '{while(match($0,"[$]{[^}]*}")) {var=substr($0,RSTART+2,RLENGTH -3);gsub("[$]{"var"}",ENVIRON[var])}}1' < input.txt > output.txt
eval
方法很好,但是在 XML 文件等方面往往会失败。
答案3
可以用脚本完成(例如文件名是expand.sh
):
while read line; do eval echo \"$line\"; done < $1 > $2
该脚本可以这样调用:
env VAR1=value1 sh expand.sh input_file output_file
—http://www.issociate.de/board/post/281806/sed_replace_by_enviroment_var_content.html
答案4
$"xxx"
可能是一个简单的方法
a=$(< file)
eval b=\$\"$a\"
那么“$b”就是扩展的文本