【问题标题】:shell script to read values from one file and replace it in other file用于从一个文件中读取值并将其替换到另一个文件中的 shell 脚本
【发布时间】:2016-04-14 18:57:04
【问题描述】:

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

【问题讨论】:

  • 您的此处文档已损坏。如果您想将某事重定向到文件,请检查它需要像cat &lt;&lt; EOF &gt; $2 这样的手册页。 cat &gt; 只会挂起。你可能需要逃离shebang的!
  • 马克 - 它没有帮助
  • 导出变量,否则它们没有在子进程中定义
  • 嗨 - 我已经导出了变量。 .代码中的 $3。

标签: json linux bash shell heredoc


【解决方案1】:

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

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

附:恕我直言,你做这件事的方式有点过分了。我更喜欢使用sed 来完成这项任务——只需要一个字符串:

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

【讨论】:

  • 谢谢 - 我找到了文件并认为足够了。
  • @Chucks 请考虑使用我在更新中提到的sed
  • 看来我在格式化上花费了太多时间。请参阅我对命令 envsubst 的答案作为 sed 的替代方法,以及获取要导出的变量的解决方法,而无需不必要地修改/弄乱原始配置文件的语法。
  • 导出和分配是两个不同的东西!你可以 export ALERT_LEVEL NORMAL_LEVEL RELAX_LEVEL; source config_file 而不在配置文件中添加 export 指令。
  • @F.Hauri 公平竞争假设如果您不知道配置文件内容,您不知道要导出什么。将配置文件的内容移动到主脚本会破坏模块化并使配置文件无用。
【解决方案2】:

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

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

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

不过,这里的诀窍是您的环境变量位于另一个文本文件中。所以它们没有在命令行本身上指定;他们需要exported 才能被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、...):How to replace ${} placeholders in a text file?

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2018-01-22
    • 2021-09-04
    • 2020-11-19
    相关资源
    最近更新 更多