我有几个文本文件,我已经介绍了shellvariables(例如$ VAR1或$ VAR2)。
我想把这些文件(一个接一个)保存在新的文件中,所有的variables将被replace。
为此,我使用了下面的shell脚本(在StackOverflow上find):
while read line do eval echo "$line" >> destination.txt done < "source.txt"
这对非常基本的文件非常有效。
套接字在阻塞模式下的行为
如何读取Visual Studio中的debugging内存窗口
但是在更复杂的文件中,“eval”命令太多了:
以“#”开始的行被跳过
有没有更好的方法来做到这一点? (在shell脚本中…我知道这很容易用Ant来完成)
亲切的问候
如何在Linux上安装node.js和npm?
通过共享库连接Python和Torch7(Lua)
好的文本/代码编辑器的Linux
运行adb设备显示未经授权的设备?
非抢先的线程?
看,我的系统上有一个envsubst命令是gettext-base包的一部分。
所以,这很容易:
envsubst < "source.txt" > "destination.txt"
在参考答案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)的所有实例。
如果你真的只想使用bash(和sed),那么我会通过你的每个环境变量(由POSIX模式返回的set ),并建立一堆-e 'regex'从sed,终止由-e 's/$[a-zA-Z_][a-zA-Z0-9_]*//g' ,然后传递给sed。
Perl会做一个更好的工作,但是你可以以数组的形式访问环境变量,你可以做可执行的替换,所以你只能匹配任何一个环境变量。
其实你需要改变你的read read -r ,这将使其忽略反斜杠。
另外,你应该避免引号和反斜杠。 所以
while read -r line; do line="${line//\/\\}" line="${line//"/\"}" line="${line//`/\`}" eval echo ""$line"" done > destination.txt < source.txt
尽管如此,仍然是一个糟糕的做法。
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"
也许它有助于某人。
导出所有需要的变量,然后使用perl onliner
TEXT=$(echo "$TEXT"|perl -wpne 's#${?(w+)}?# $ENV{$1} // $& #ge;')
这将用实际值替换TEXT中的所有ENV变量。 行情也保存:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。