当我输出文件时如何替换环境变量?

当我输出文件时如何替换环境变量?

我想以某种方式导出一个文件(其中包含环境变量引用)并替换实际值。这是我尝试过的,但如您所见,它不起作用。有什么想法吗?

-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”就是扩展的文本

相关内容