我想将一组字符串替换为新文件。源文件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":""
}
]
}
答案 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
可用,请参阅此答案以了解其他选项(例如eval
,sed
,m4
,...) :How to replace ${} placeholders in a text file?