我在我所介绍的shell变量($ VAR1或$ VAR2例如)几个文本文件。
我想借这些文件(一个接一个),并将它们保存到新文件中,所有的变量将已被替换。
要做到这一点,我用下面的shell脚本(在计算器上找到):
while read line
do
eval echo "$line" >> destination.txt
done < "source.txt"
这个作品非常好于非常基本的文件。
但在更复杂的文件,“EVAL”命令确实太多了:
开始以“#”的行将被忽略
XML文件解析的结果吨的错误
有没有更好的办法做到这一点? (在shell脚本......我知道这是很容易用蚂蚁做了实例)
亲切的问候
Answer 1:
看,事实证明我的系统上有一个envsubst
命令,它是gettext的基包的一部分。
所以,这很容易:
envsubst < "source.txt" > "destination.txt"
Answer 2:
在参考答案2,讨论envsubst时,你问:“我怎样才能使其与在我.SH脚本声明的变量的工作?”
答案是,你只需要您的变量调用envsubst之前出口。
您还可以限制要在使用envsubst SHELL_FORMAT参数(避免了在输入无意替换字符串的一个共同shell变量的值 - 例如$ HOME)输入替换变量字符串。
例如:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
将分别取代与“someValue中”和“someothervalue”的Source.txt $ VAR1和$ VAR2(只有VAR1和VAR2)的所有实例。
Answer 3:
我知道这个话题是旧的,但我有没有出口变量简单可行的解决方案。 可一oneliner,但我更喜欢使用分割\
上线结束。
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
该变量需要为被定义为在同一行envsubst
是让视为环境变量。
在'$var1,$var3'
是可选的,只更换指定的。 想象一下,一个包含输入文件${VARIABLE_USED_BY_JENKINS}
不应该被更换。
Answer 4:
- 定义你的ENV变量
$ export MY_ENV_VAR=congratulation
- 创建模板文件(in.txt)具有以下内容
$MY_ENV_VAR
您还可以使用您的系统一样(在Linux)$ TERM,$ SHELL,$ HOME中定义的所有其他ENV变量...
- 运行此命令raplace所有ENV变量在in.txt文件和结果写入到out.txt
$ envsubst "`printf '${%s} ' $(sh -c "env|cut -d'=' -f1")`" < in.txt > out.txt
- 检查out.txt文件的内容
$ cat out.txt
你应该看到“祝贺”。
Answer 5:
如果你真的只想要使用bash(和SED),那么我会去通过每一个环境变量(如返回set
在POSIX模式),并建立了一堆-e 'regex'
从那个sed的,由终止-e 's/\$[a-zA-Z_][a-zA-Z0-9_]*//g'
,然后通过所有该给sed的。
Perl中会虽然做一个更好的工作,你可以访问环境瓦尔作为一个数组,你可以做替换可执行文件,所以你只有一次匹配任何环境变量。
Answer 6:
其实你需要改变你read
来read -r
这将使其忽略反斜线。
此外,你应该逃避引号和反斜线。 所以
while read -r line; do
line="${line//\\/\\\\}"
line="${line//\"/\\\"}"
line="${line//\`/\\\`}"
eval echo "\"$line\""
done > destination.txt < source.txt
仍然是一个可怕的方式做扩张虽然。
Answer 7:
envsubst
似乎完全一样的东西我想用,但-v
选项让我吃惊了一下。
虽然envsubst < template.txt
工作正常,与选项相同-v
不工作:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.1 (Maipo)
$ envsubst -V
envsubst (GNU gettext-runtime) 0.18.2
Copyright (C) 2003-2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Bruno Haible.
正如我写的,这是不工作:
$ envsubst -v < template.txt
envsubst: missing arguments
$ cat template.txt | envsubst -v
envsubst: missing arguments
我不得不这样做,使其工作:
TEXT=`cat template.txt`; envsubst -v "$TEXT"
也许这可以帮助别人。
Answer 8:
导出所有需要的变量,然后使用一个Perl onliner
TEXT=$(echo "$TEXT"|perl -wpne 's#\${?(\w+)}?# $ENV{$1} // $& #ge;')
这将取代目前的所有与实际值的文本ENV变量。 行情也会保留下来:)
文章来源: How to substitute shell variables in complex text files