在Linux中,假设我有以下文件(例如conf.properties):
HOST_URL=http://$HOSTNAME
STD_CONFIG=http://$HOSTNAME/config
USER_CONFIG=http://$HOSTNAME/config/$unconfigured
Run Code Online (Sandbox Code Playgroud)
我想创建另一个替换了所有环境变量的文件...比如说环境变量$ HOSTNAME是'myhost'并且未设置$ unconfigured,脚本应该产生以下输出:
HOST_URL=http://myhost
STD_CONFIG=http://myhost/config
USER_CONFIG=http://myhost/config/
Run Code Online (Sandbox Code Playgroud)
我认为这可以通过一个简单的单行程来完成,带有某种sed/awk魔法,但我不是专家,而且我的搜索已经静止,所以感谢任何帮助.
编辑:
我应该提一下,该文件可以是任何格式的文本文件,例如xml.我只想用环境中当前设置的任何东西替换任何看起来像env变量的东西.
Mal*_*ous 145
这envsubst是为了什么.
echo 'Hello $USER'
Hello $USER
echo 'Hello $USER' | envsubst
Hello malvineous
Run Code Online (Sandbox Code Playgroud)
你可能会更喜欢这样使用它:
envsubst < input.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
envsubst 似乎是GNU gettext的一部分.
sed 's/$HOSTNAME/myhost/g;s/$unconfigured//g' yourfile.txt > another_file.txt
Run Code Online (Sandbox Code Playgroud)
根据您问题的更新,这不是一个好的解决方案.
这是基于相关问题的答案.我已经攻击它(我不熟悉perl)来删除未定义的变量.
perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg; s/\$\{([^}]+)\}//eg' yourfile.txt
Run Code Online (Sandbox Code Playgroud)
应该适用于任何输入文本文件,但是您需要使用${...}简化字符串匹配的格式来定义变量.
(关于eval邪恶的咆哮移到一个单独的帖子,以免混淆读者)
"eval是邪恶的"
这不是答案,而是响应于使用eval执行此任务的警告.你真的真的不想那样做.
图表1:恶意模板文件:
HOST_URL=http://$HOSTNAME
STD_CONFIG=http://$HOSTNAME/config
USER_CONFIG=http://$HOSTNAME/config/$unconfigured
&& cat /etc/redhat-release
Run Code Online (Sandbox Code Playgroud)
一个毫无戒心的用户:
[lsc@aphek]$ cat somefile | while read line; do echo $(eval echo `echo $line`); done
HOST_URL=http://xyz
STD_CONFIG=http://xyz/config
USER_CONFIG=http://xyz/config/
Red Hat Enterprise Linux WS release 4 (Nahant Update 9)
Run Code Online (Sandbox Code Playgroud)
注意最后一行!
现在,想象一下可能性......
我这样做:
# Set the $HOSTNAME and other variables
# Now evaluate the properties file as a shell script.
. config.properties
# Write the values
cat >somefile <<EOF
HOST_URL=$HOST_URL
STD_CONFIG=$STD_CONFIG
USER_CONFIG=$USER_CONFIG
EOF
Run Code Online (Sandbox Code Playgroud)
编辑:或者这个非常讨厌的事情(我确信有更好的方法)
for name in HOST_URL STD_CONFIG USER_CONFIG
echo "$name=$(eval echo `echo '$'$name`)" >>somefile
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31955 次 |
| 最近记录: |