合并新旧配置文件

时间:2017-02-13 09:07:23

标签: bash

如何使用旧版本中不存在的行更新配置文件?

示例:

的config.cfg:

parameterA=0
parameterB=1
parameterC=0

config.cfg.sample:

parameterA=0
parameterB=0
parameterC=0
parameterD=0

我想要做的是执行将更新config.cfg文件的命令,使用config.cfg.sample文件并获取结果:

parameterA=0
parameterB=1
parameterC=0
parameterD=0

新行不会总是在最后。不得更改现有行。

例如:

update_config.sh config.cfg config.cfg.sample

谢谢!

2 个答案:

答案 0 :(得分:1)

这应该做的工作。 “config.cfg”是原始文件,而“config.new”是从中获取新关键字的文件。

#!/bin/sh

exec 0<config.new
while read line; do
  parname=$(echo "$line" |cut -d= -f1)
  # echo "  (debug) new parname=$parname"
  grep "^$parname" config.cfg || echo $line >> config.cfg
done

理由是:逐行读取config.new;提取参数名称(通过剪切),确定该参数名称是否包含在原始文件中,如果没有,则将其附加到文件中。

但是,新参数将始终附加到原始文件中。如果需要的话,通过排序传递最终文件可能会有所帮助。

旁听:可能甚至可以避免使用cut命令,因为shell可以进行这种字段提取。我选择保持简单。

答案 1 :(得分:1)

您不需要此连接的任何循环。 有一个用于此目的的工具,称为连接。 此命令将为您提供所需的结果。

join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2

如果您在结尾处移除剪切,您将能够看到&#34;比较&#34;两个文件之间。

测试:

$ cat b.txt
parameterA=0
parameterB=1
parameterC=0

$ cat bb.txt
parameterA=0
parameterB=0
parameterC=0
parameterD=0

$ join -a1 -a2 -t= b.txt bb.txt |cut -d= -f1-2
parameterA=0
parameterB=1
parameterC=0
parameterD=0