如何使用旧版本中不存在的行更新配置文件?
示例:
的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
谢谢!
答案 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