如何替换在复杂的文本文件shell变量(How to substitute shell variab

2019-08-05 13:49发布

我在我所介绍的shell变量($ VAR1或$ VAR2例如)几个文本文件。

我想借这些文件(一个接一个),并将它们保存到新文件中,所有的变量将已被替换。

要做到这一点,我用下面的shell脚本(在计算器上找到):

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

这个作品非常好于非常基本的文件。

但在更复杂的文件,“EVAL”命令确实太多了:

  • 开始以“#”的行将被忽略

  • XML文件解析的结果吨的错误

有没有更好的办法做到这一点? (在shell脚本......我知道这是很容易用蚂蚁做了实例)

亲切的问候

Answer 1:

看,事实证明我的系统上有一个envsubst命令,它是gettext的基包的一部分。

所以,这很容易:

envsubst < "source.txt" > "destination.txt"


Answer 2:

在参考答案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)的所有实例。



Answer 3:

我知道这个话题是旧的,但我有没有出口变量简单可行的解决方案。 可一oneliner,但我更喜欢使用分割\上线结束。

var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"

#         ^^^^^^^^^^^    ^^^^^^^^^^     ^^^^^^^^^^^^^^^
# define which to replace   input            output

该变量需要为被定义为在同一行envsubst是让视为环境变量。

'$var1,$var3'是可选的,只更换指定的。 想象一下,一个包含输入文件${VARIABLE_USED_BY_JENKINS}不应该被更换。



Answer 4:

  1. 定义你的ENV变量
$ export MY_ENV_VAR=congratulation
  1. 创建模板文件(in.txt)具有以下内容
$MY_ENV_VAR

您还可以使用您的系统一样(在Linux)$ TERM,$ SHELL,$ HOME中定义的所有其他ENV变量...

  1. 运行此命令raplace所有ENV变量在in.txt文件和结果写入到out.txt
$ envsubst "`printf '${%s} ' $(sh -c "env|cut -d'=' -f1")`" < in.txt > out.txt
  1. 检查out.txt文件的内容
$ cat out.txt

你应该看到“祝贺”。



Answer 5:

如果你真的只想要使用bash(和SED),那么我会去通过每一个环境变量(如返回set在POSIX模式),并建立了一堆-e 'regex'从那个sed的,由终止-e 's/\$[a-zA-Z_][a-zA-Z0-9_]*//g' ,然后通过所有该给sed的。

Perl中会虽然做一个更好的工作,你可以访问环境瓦尔作为一个数组,你可以做替换可执行文件,所以你只有一次匹配任何环境变量。



Answer 6:

其实你需要改变你readread -r这将使其忽略反斜线。

此外,你应该逃避引号和反斜线。 所以

while read -r line; do
  line="${line//\\/\\\\}"
  line="${line//\"/\\\"}"
  line="${line//\`/\\\`}"
  eval echo "\"$line\""
done > destination.txt < source.txt

仍然是一个可怕的方式做扩张虽然。



Answer 7:

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"

也许这可以帮助别人。



Answer 8:

导出所有需要的变量,然后使用一个Perl onliner

TEXT=$(echo "$TEXT"|perl -wpne 's#\${?(\w+)}?# $ENV{$1} // $& #ge;')

这将取代目前的所有与实际值的文本ENV变量。 行情也会保留下来:)



文章来源: How to substitute shell variables in complex text files
标签: linux shell