我有几个引入了外壳变量(例如$VAR1或$VAR2 )的文本文件。
我想把这些文件(一个接一个)保存到新文件中,所有的变量都会被替换。
为此,我使用了以下shell脚本(可在StackOverflow上找到):
while read line
do
eval echo "$line" >> destination.txt
done < "source.txt"
这在非常基本的文件上工作得很好。
但是对于更复杂的文件,"eval“命令做得太多了:
跳过以"#“开头的
有没有更好的方法呢?(在shell脚本中...例如,我知道使用Ant很容易做到这一点)
亲切的问候
发布于 2013-01-04 20:54:11
看起来,在我的系统上有一个envsubst
命令,它是gettext-base包的一部分。
因此,这使得它变得很容易:
envsubst < "source.txt" > "destination.txt"
注如果你想对这两个文件使用相同的文件,你必须使用类似于moreutil的sponge
,正如Johnny Utahh:envsubst < "source.txt" | sponge "source.txt"
所建议的那样。(因为shell重定向将在读取文件之前清空该文件。)
发布于 2018-02-13 16:35:24
我知道这个话题很老了,但我有一个更简单的解决方案,不需要导出变量。可以是一个线条,但我更喜欢在线端使用\
进行拆分。
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
需要将变量定义为与envsubst
相同的行,才能将其视为环境变量。
'$var1,$var3'
是可选的,仅用于替换指定的only。假设一个输入文件包含不应该被替换的${VARIABLE_USED_BY_JENKINS}
。
发布于 2018-01-16 20:22:00
$ export MY_ENV_VAR=congratulation
创建模板文件(in.txt
$MY_ENV_VAR
您还可以使用系统定义的所有其他ENV变量,比如(在linux中) $TERM、$SHELL、$HOME……
$ envsubst "`printf '${%s} ' $(sh -c "env|cut -d'=' -f1")`" < in.txt > out.txt
$ cat out.txt
你应该看到“恭喜”。
https://stackoverflow.com/questions/14155596
复制相似问题