【问题标题】:Compare two java property files using shell script [closed]使用 shell 脚本比较两个 java 属性文件 [关闭]
【发布时间】:2010-12-10 19:45:18
【问题描述】:

如何使用 shell 脚本比较两个不同文件夹中的两个属性文件 输入可以是两个文件夹的路径吗?

两个文件夹中有多个文件,每个文件都需要检查

【问题讨论】:

    标签: java unix shell


    【解决方案1】:

    您可能需要多解释一下您的要求。但是,您很可能可以使用 diff 命令执行您想要的操作(在 sort 和/或 grep 的帮助下)。

    假设您有两个文件:a.properties 和 b.properties

    如果您只是想知道文件是否有任何不同,您可以使用

    diff a.properties b.properties
    

    如果它们相同或差异列表,您将不会得到任何输出。

    如果您想在更语义级别上进行比较,即两组属性是否相同,那么您需要做更多的事情。这些文件在文本上可能有所不同,但对于使用它们的 Java 程序来说意义相同。例如,属性可以以不同的顺序出现。可以有空行、其他空格和 cmets。

    如果是这种情况,您是否关心 cmets 是否相同?它们不会影响程序的运行,但它们具有意义(并且对阅读文件的人具有价值)。如果你不在乎,就把它们去掉。

    你可能不关心空行,因为它们没有意义。

    您还需要处理以下情况:

    a.properties:
        prop = value
    b.properties:
        prop=value
    

    同样,文本不同(注意等号周围的空格)但在 Java 中具有相同的含义。

    从简单的开始,我们假设属性以相同的顺序出现。

    忽略空行:

    diff -B a.properties b.properties
    

    处理随机空白(例如等号周围)

    diff -w a.properties b.properties
    

    结合所有这些:

    diff -w -B a.properties b.properties
    

    去掉cmets:

    grep -v '^#.*$' a.properties > a.tmp
    grep -v '^#.*$' b.properties > b.tmp
    diff -w -B a.tmp b.tmp
    rm a.tmp b.tmp
    

    允许以不同的顺序排列属性,去除 cmets:

    grep -v '^#.*$' a.properties | sort > a.tmp
    grep -v '^#.*$' b.properties | sort > b.tmp
    diff -w -B a.tmp b.tmp
    rm a.tmp b.tmp
    

    【讨论】:

      【解决方案2】:

      您应该考虑使用 diff 或 sdiff。我建议事先对文件进行排序并删除任何空白行以减少噪音;例如

      file1=/var/tmp/foo.txt
      file2=/var/tmp/bar.txt
      
      sort ${file1} | grep -v '^$' > ${file1}.tmp
      sort ${file2} | grep -v '^$' > ${file2}.tmp
      sdiff ${file1} ${file2}
      

      【讨论】:

      • @Adamski - 属性文件中的 cmets 怎么样?
      • 这也会显示 cmets 之间的差异
      • @StephenC - grep -vE "^$|^#" 将为您工作
      【解决方案3】:

      语义比较,最好使用PropDiff

      Usage: [flags] properties-file1 properties-file2 [-f filenameOrPathPrefixForResults]
         flags:
           -c  property settings that are common to both p1 and p2, where p2 take precedence
           -u  union p1 and p2 where p2 has higher precedence
           -1  properties settings that are only in p1
           -2  properties settings that are only in p2
           -d  intersection of properties in p1 and p2 that have different values
           -e  intersection of properties in p1 and p2 that have equal values
      

      【讨论】:

        【解决方案4】:

        comm 是一个有用的实用程序。它可以告诉您 file1 中的内容而不是 file2 中的内容、file2 中的内容和 file1 中的内容以及两个文件之间的共同点。它要求首先对这两个文件进行排序。

        我赞成@antispams PropDiff 的答案,因为它似乎正是您所要求的。

        【讨论】:

          【解决方案5】:

          尝试使用 diff 程序,调用“diff /path/to/first/file /path/to/second/file”并用 grep 搜索它们。对于 diff 的特殊用途(如果您需要什么特别的东西),请尝试搜索 man diff。

          【讨论】:

            【解决方案6】:

            取决于你想要什么。不同的评论有区别吗?空白?命令?我认为最简单的将是一个小的 groovy 脚本。这是一个选项吗?如果不是,请确保在使用 diff 之前去除 cmets abd 空格并对输出进行排序

            编辑:虽然可以让 diff 忽略空格,但我不确定这是否是您想要的,因为空格可能是属性值的一部分

            【讨论】:

              【解决方案7】:

              这个 Groovy 允许你区分两个属性文件。

              您可以选择 2 种差异模式: 1.显示彼此缺少的属性 2.比较值以查看相似性和差异

              https://gist.github.com/aimtiaz11/f786346e0c0d11a5475cfb64e84e9459

              【讨论】:

              • 请在此处添加链接的相关部分
              • 该链接中的每个部分都是相关的。您需要将 groovy 脚本放在属性文件所在的位置,然后运行它。那里详细介绍了设置步骤以及实际脚本。
              【解决方案8】:

              查看另一个 PHP 代码来区分属性文件 on my blog:

              php list_missing_properties.php "file1.properties" "file2.properties"

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多