繁体   English   中英

Shell脚本从一个文件读取值并将其替换为另一文件

[英]shell script to read values from one file and replace it in other file

我想将一组字符串替换为一个新文件。 源文件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":""
            }
        ]
    }

只是解释@ user3159253的评论。 您的file1.config应该看起来像这样,代码才能正常工作:

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

PS恕我直言,您做事情的方式有点过分精细。 我更喜欢使用sed完成此任务-只需要一个字符串:

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

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

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

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

但是,这里的窍门是您的环境变量在另一个文本文件中。 因此,它们不是在命令行本身上指定的。 他们需要export才能被envsubst看到。 例如,

#!/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 ,...): 如何在文本文件中替换$ {}占位符?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM