【问题标题】:Comparing two environment properties files and have only the added properties in the new file migrated to the old file比较两个环境属性文件,仅将新文件中添加的属性迁移到旧文件
【发布时间】:2013-12-03 14:42:50
【问题描述】:
你好,这里是我想要完成的设置
文件 A(新环境属性文件)
DB_CONNECTION=
DB_REPO=
DB_TEST=
DB_USER=
文件 B(旧环境属性)
DB_REPO=
DB_USER=
我只需要将 DB_CONNECTION 和 DB_TEST 添加到该文件中,可能还有更多要添加的,这只是一个示例。
我尝试了多个 grep 和 diff 命令,但它们只是输出屏幕或替换整个文件。我不想这样做,因为用户已经保存了值,所以我只需要添加新属性。
提前致谢
【问题讨论】:
标签:
linux
properties
configuration
【解决方案1】:
我建议在自己的子 shell 中获取每个文件,执行 set 以显示完整的环境变量集,并比较两个输出。听起来很复杂,但输入起来相当容易:
diff <(source a.sh; set) <(source b.sh; set)
输出是典型的diff 输出,在我的例子中:
19d18
< DB_CONNECTION=
21d19
< DB_TEST=
87c85
< _=a.sh
---
> _=b.sh
最后两行(_=a.sh 和_=b.sh)没有意思;它们只显示最后使用的参数(当然不同)。
现在,要将找到的内容添加到要修补的文件中,可以使用以下命令:
diff <(source a.sh; set) <(source b.sh; set) | grep '^<' | cut -c3- | grep -v '^_=' >> b.sh
不过,此解决方案不考虑更改的值。如果用户在他的旧配置文件中更改了一个值,新的配置文件将再次具有标准值,这将是一个区别,所以它将被添加到旧的配置文件中。
您可能不希望这样,因此您可能需要指定有关如何处理更改的值的进一步要求。
【解决方案2】:
我采用以下方法,这将基本上将旧属性与每个属性的值合并并添加所有新属性。在脚本的末尾,我只有以下命令
sed -i 'property/d' environment.properties
这是一位同事帮助我完成的合并脚本
#!/bin/bash
old_file=
new_file=
while read new_line; do
# Check to see if the current line is a comment.
comment=$(echo "${new_line}" | grep '^[ \t]*[#!]')
# Print comments as-is.
if [ -n "${comment}" ]; then
echo "${new_line}"
continue
fi
# Get the property key.
key=$(echo "${new_line}" | sed -e 's/^[ \t]*\([^=:]\+\).*/\1/')
# If the line isn't a comment or a property, skip it.
if [ -z "${key}" ]; then
echo "ERROR: invalid property: ${new_line}" 1>&2
continue
fi
# Get the old value for the key.
old_line=$(grep "^[ \t]*${key}[ \t]*[=:]" ${old_file})
if [ -n "${old_line}" ]; then
# If there is an old value, used it.
echo "${old_line}" | sed -e 's/^[ \t]*//'
else
# Otherwise, use the new value.
echo "${new_line}"
echo "WARN: new property: ${key}" 1>&2
fi
完成
感谢您的帮助