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

如何在复杂的文本文件中replaceshellvariables,第1张

概述如何在复杂的文本文件中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变量。 行情也保存:)

总结

以上是内存溢出为你收集整理的如何在复杂的文本文件中replaceshellvariables全部内容,希望文章能够帮你解决如何在复杂的文本文件中replaceshellvariables所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1264681.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存