【问题标题】: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
【问题描述】:

你好,这里是我想要完成的设置

  • 用户在他们的机器上有一个环境属性文件,它有一个包含 300 个属性的列表。

  • 然后,我们将新版本部署到同一系统,其中包含该文件的更新版本,并添加了更多属性。我不想摆脱旧的 env 道具文件,我只想添加那些新属性,而用户不必这样做。示例

文件 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
      

      完成

      感谢您的帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 2015-01-12
        • 2013-11-08
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        相关资源
        最近更新 更多