提问者:小点点

如何替换复杂文本文件中的外壳变量


我在几个文本文件中引入了shell变量(例如VAR1或$VAR2)。

我想把这些文件(一个接一个)保存在所有变量都会被替换的新文件中。

为此,我使用了以下shell脚本(可在StackOverflow上找到):

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

这在非常基本的文件上非常有效。

但是对于更复杂的文件,“eval”命令做得太多了:

>

  • 跳过以“#”开头的行

    XML文件解析会导致大量错误

    有没有更好的方法?(在外壳脚本中...例如,我知道这很容易用蚂蚁完成)

    亲切的问候


  • 共3个答案

    匿名用户

    看起来,在我的系统上有一个envsubst命令,它是gettext基本包的一部分。

    因此,这使其变得容易:

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

    注如果您想对两者使用同一个文件,您必须使用类似于moreutil的< code>sponge的东西,正如Johnny Utahh所建议的

    匿名用户

    关于答案2,在讨论envsubst时,您问:

    我怎样才能让它与我的?sh剧本?

    答案是,您只需要在调用envsubst之前导出变量。

    您还可以使用 envsubst SHELL_FORMAT 参数限制要在输入中替换的变量字符串(避免意外地将输入中的字符串替换为公共 shell 变量值 - 例如 $HOME)。

    例如:

    export VAR1='somevalue' VAR2='someothervalue'
    MYVARS='$VAR1:$VAR2'
    
    envsubst "$MYVARS" <source.txt >destination.txt
    

    source. txt中的$VAR1$VAR2的所有实例(并且仅VAR1VAR2)分别替换为'Somvalue''某物值'

    匿名用户

    我知道这个主题很旧,但我有一个更简单的工作解决方案,无需导出变量。可以是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}