微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在复杂的文本文件中replaceshellvariables

我有几个文本文件,我已经介绍了shellvariables(例如$ VAR1或$ VAR2)。

我想把这些文件一个一个)保存在新的文件中,所有的variables将被replace。

为此,我使用了下面的shell脚本(在StackOverflow上find):

while read line do eval echo "$line" >> destination.txt done < "source.txt"

这对非常基本的文件非常有效。

套接字在阻塞模式下的行为

如何读取Visual Studio中的debugging内存窗口

获取以太网端口的ioctl文件描述符

如何在Python中增加一个整数天5天

如何提取XML文件的特定元素?

但是在更复杂的文件中,“eval”命令太多了:

以“#”开始的行被跳过

XML文件parsing导致大量的错误

有没有更好的方法来做到这一点? (在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] 举报,一经查实,本站将立刻删除。

相关推荐