shell脚本从一个文件中读取值并将其替换为其他文件

时间:2016-01-10 11:54:28

标签: json linux bash shell heredoc

我想将一组字符串替换为新文件。源文件file1.json值必须由file1.config中的值替换为文件file2.json。我有以下脚本未能这样做。

file1.json

{
    "colorsArray":[{
            "red":"$ALERT_LEVEL",
            "green":"$NORMAL_LEVEL",
            "blue":"$RELAX_LEVEL"
        }
    ]
}

file1.config

[root@ip10]# cat file1.config
ALERT_LEVEL=DANGER
NORMAL_LEVEL=NORMAL
RELAX_LEVEL=RELAX

run.sh

    #!/bin/bash
set -x
if [ $# -ne 3 ]; then
  echo "USAGE:
        ./$0 file1.json file2.json file1.config"
  exit 1
fi
echo "#!/bin/bash
cat > $2 << EOF
`cat $1`
EOF" > $2;
chmod +x $2;
# load variables into env
. $3
# actually replace variables
./$2

错误:

[root@ip10]# ./run2.sh file1.json file2.json file1.config
./file2.json: line 11: warning: here-document at line 2 delimited by end-of-file (wanted `EOF')
出现

file2.json ,但没有替换值。

root@ip10]# cat file2.json 
    {
        "colorsArray":[{
                "red":"",
                "green":"",
                "blue":""
            }
        ]
    }

2 个答案:

答案 0 :(得分:2)

只是解释@ user3159253的评论。您的file1.config应该如下所示,以使您的代码正常工作:

export ALERT_LEVEL=DANGER
export NORMAL_LEVEL=NORMAL
export RELAX_LEVEL=RELAX

P.S。恕我直言,你做这件事的方式有点过于复杂。我更喜欢使用sed来完成此任务 - 只需要一个字符串:

sed file1.json -e 's/$ALERT_LEVEL/DANGER/g' -e's/$NORMAL_LEVEL/NORMAL/g' -e's/$RELAX_LEVEL/RELAX/g' >file2.json

答案 1 :(得分:0)

这是从文件中读取env变量并将这些值替换为另一个文件的经典问题。将eval与输入文件一起使用存在固有的危险,因此应该避免这种情况。

最简单的方法是,如果您的系统已经拥有envsubst命令,它会为您执行此操作。用法:

$ var1=value1 var2=value2 envsubst < input.txt > output.txt

但是,这里的诀窍是你的env vars在另一个文本文件中。所以它们并没有在命令行中指定;他们需要export才能被envsubst看到。 E.g,

#!/bin/bash
export var1=value1
export var2=value2
envsubst < input.txt > output.txt

以下是使用env vars的输入文件执行此操作的一种可能方法:

#!/bin/bash
eval $(sed 's/^.*=/export &/' file1.config)
envsubst < file1.json > file2.json

如果您没有envsubst可用,请参阅此答案以了解其他选项(例如evalsedm4,...) :How to replace ${} placeholders in a text file?