
在linux中,说我有以下文件(例如conf.propertIEs):
HOST_URL=http://$HOSTname STD_CONfig=http://$HOSTname/config USER_CONfig=http://$HOSTname/config/$unconfigured
我想创build另一个文件,所有的环境variables取代…例如说环境variables$ HOSTname是'myhost'和$未configuration未设置,脚本应该产生以下输出:
HOST_URL=http://myhost STD_CONfig=http://myhost/config USER_CONfig=http://myhost/config/
我以为这可以通过简单的一行sed / awk魔法来完成,但我不是专家,我的search一直都是静止的,所以感谢任何帮助。
编辑:
Uniqing基于字段子集的分隔文件
为什么我可以在写入linux时成功移动一个文件?
Bash:内联执行返回重复的“进程”。 为什么?
linux – 数字sorting然后覆盖文件
为什么struct stat中的st_size字段被签名?
我应该提到,该文件可以是任何格式的文本文件,例如xml。 我只是想用当前在环境中设置的东西来replace看起来像envvariables的东西。
Bash while两次之间的循环
查找不包含“* .sql”文件的目录
如何改变我的git的语言?
什么是RTW_CMD_THREAD负责?
重启后失效的PID文件
sed 's/$HOSTname/myhost/g;s/$unconfigured//g' yourfile.txt > another_file.txt
更新:
根据你的问题更新,这不是一个好的解决方案。
更新2:
这是基于对相关问题的回答 。 我已经黑了(我不熟悉Perl)删除未定义的变量。
perl -p -e 's/${([^}]+)}/defined $ENV{$1} ? $ENV{$1} : $&/eg; s/${([^}]+)}//eg' yourfile.txt
应该为任何输入文本文件工作,但是您将需要使用简化字符串匹配的${...}格式定义变量。
( 关于eval的邪恶转移到一个单独的帖子,以免混淆读者 )
这是envsubst的用途。
echo 'Hello $USER' Hello $USER echo 'Hello $USER' | envsubst Hello malvineous
你可能会更像这样使用它:
envsubst < input.txt > output.txt
envsubst似乎是GNU gettext的一部分。
我会这样做:
# 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
编辑 :或者这非常讨厌的事情(我敢肯定还有更好的办法)
for name in HOST_URL STD_CONfig USER_CONfig echo "$name=$(eval echo `echo '$'$name`)" >>somefile end
“eval是邪恶的”
这不是一个答案,而是一个响应使用eval来完成这个任务的警告。 你真的真的不想这样做。
图表1:恶意模板文件:
HOST_URL=http://$HOSTname STD_CONfig=http://$HOSTname/config USER_CONfig=http://$HOSTname/config/$unconfigured && cat /etc/redhat-release
一个毫不怀疑的用户:
[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)
注意最后一行!
现在,想象一下可能性….
感谢@DarkDust,我想出了这个:
cat somefile | while read line; do echo $(eval echo `echo $line`); done > somefile.replaced
我用这个oneliner来替换文件中的${VARIABLE}样式变量:
TARGET_file=/etc/apache2/apache2.conf; for VARname in $(grep -P -o -e '${S+}' ${TARGET_file} | sed -e 's|^${||g' -e 's|}$||g' | sort -u); do sed -i "s|${$(echo $VARname)}|${!VARname}|g" ${TARGET_file}; done
我敢肯定,有人可以做到这一点在三分之一的长度使用awk …感觉挑战! ;)
下面是一个简短的一行,它使用python的大括号格式来安全地实现魔法:
contents="""`cat $file`"""; python -c "import os;print $contents.format(**os.environ)"
避免邪恶的评估
允许输出大括号:使用{{而不是{
调用脚本时不需要明确指定变量
例如,给定的属性文件settings.propertIEs :
# my propertIEs file someVar = {MY_ENV_VAR} curlyBraceVar = has {{curly braces}}
然后,用下面的代码进行替换:
$ export MY_ENV_VAR="hello" $ file=settings.propertIEs $ contents="""`cat $file`"""; python -c "import os;print $contents.format(**os.environ)" # my propertIEs file someVar = hello curlyBraceVar = has {curly braces}
脚本在这里: https : //raw.githubusercontent.com/aneilbaboo/machome/master/bin/substenv
总结以上是内存溢出为你收集整理的replace属性文件中的环境variables全部内容,希望文章能够帮你解决replace属性文件中的环境variables所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)