shell 从一个文件中读取值并将其替换到另一个文件中的脚本
shell script to read values from one file and replace it in other file
我想将一组字符串替换到一个新文件中。必须将源文件 file1.json 中的值替换为文件 file2.json 中 file1.config 中的值。我有以下脚本未能这样做。
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:
./[=13=] file1.json file2.json file1.config"
exit 1
fi
echo "#!/bin/bash
cat > << EOF
`cat `
EOF" > ;
chmod +x ;
# load variables into env
.
# actually replace variables
./
错误:
[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":""
}
]
}
只是解释@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
这是从一个文件中读取环境变量并将这些值替换到另一个文件中的经典问题。在输入文件中使用 eval
存在固有的危险,因此应避免这种情况。
最简单的方法是如果您的系统已经有命令 envsubst
,它会为您执行此操作。用法:
$ var1=value1 var2=value2 envsubst < input.txt > output.txt
不过,这里的技巧是您的环境变量位于另一个文本文件中。所以它们没有在命令行本身上指定;他们需要 export
ed 才能被 envsubst
看到。例如,
#!/bin/bash
export var1=value1
export var2=value2
envsubst < input.txt > output.txt
这是使用环境变量的输入文件执行此操作的一种可能方法:
#!/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?
我想将一组字符串替换到一个新文件中。必须将源文件 file1.json 中的值替换为文件 file2.json 中 file1.config 中的值。我有以下脚本未能这样做。
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:
./[=13=] file1.json file2.json file1.config"
exit 1
fi
echo "#!/bin/bash
cat > << EOF
`cat `
EOF" > ;
chmod +x ;
# load variables into env
.
# actually replace variables
./
错误:
[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":""
}
]
}
只是解释@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
这是从一个文件中读取环境变量并将这些值替换到另一个文件中的经典问题。在输入文件中使用 eval
存在固有的危险,因此应避免这种情况。
最简单的方法是如果您的系统已经有命令 envsubst
,它会为您执行此操作。用法:
$ var1=value1 var2=value2 envsubst < input.txt > output.txt
不过,这里的技巧是您的环境变量位于另一个文本文件中。所以它们没有在命令行本身上指定;他们需要 export
ed 才能被 envsubst
看到。例如,
#!/bin/bash
export var1=value1
export var2=value2
envsubst < input.txt > output.txt
这是使用环境变量的输入文件执行此操作的一种可能方法:
#!/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?