【问题标题】:Linux diff with minimal match具有最小匹配的 Linux 差异
【发布时间】:2014-03-27 12:30:38
【问题描述】:

我需要仅使用 linux 命令行比较两个文本文件,以获取添加行、删除行和修改行的列表。我目前使用diff --context=0,但如果一行被“修改”并且下一行被“添加”,这两行将在单个更改集中标记为“修改”(而不是两个更改集:“修改”用于第一个,第二个“添加”)。

这是一个文件示例:

文件#1:

foo line1

文件#2:

fooX line1
bar line2

当前使用的命令:

diff --minimal --context=0 file1 file2

实际结果:

! foo line1
--- 1 ----
! fooX line1
! bar line2

需要的结果:

! foo line1
--- 1 ----
! fooX line1

+ bar line2

我预计 --minimal 会完成这项工作,但事实并非如此。它似乎找到了更少的变更集,而不是像我需要的更小的变更集。如果我在第一行之后插入一个仅包含“--”的新行,它确实可以工作,但是我必须比较的文件非常大,我真的不想在每行之间插入“--”.. .

【问题讨论】:

  • 您是否注意到实际输出小于您的预期输出?所以我会说minimal这个工具非常好用。您基于什么理由将您的预期输出称为“更好的”minimal?或者,也许您可​​以改写您的实际期望?
  • 啊,请记住 diff 从不分析 within 行的变化(因此它不会注意到 foo line1fooX line 之间的相似性),因此find 的“更改的行/块”的定义是“之前相等,之后相等”。仅当其中一个块为空时,“更改”才称为“插入”或“删除”。
  • man diff 解释说--minimal“努力寻找更小的变化集” 是指“更少的集合”还是“更小的集合”? (我需要 smaller 套,实际上我有 fewer 套)
  • @Alfe:我从未说过预期的输出会“更好”,这正是我所需要的 :) 至于实际/预期的大小,请参阅我之前的评论,它取决于如何理解man diff...
  • “较小的更改集”与“较少的更改”相同。

标签: linux diff match


【解决方案1】:

由于diff没有合适的解决方案,我生成了:

  • 列出所有新行的文件(使用另一个内部处理)
  • 另一个列出已删除行的文件(使用另一个内部处理)
  • diff --context=0 file1 file2 | grep "^\!" 的结果

然后我通过删除所有已删除/添加的行来过滤第三个文件的输出:

while read line
do
        if ! ( grep -q -- "$line" $ADDED_LINES_FILE $REMOVED_LINES_FILE) ; then
                echo "$line"
        fi
done < diff_output > $TMP_FILE
mv $TMP_FILE diff_output

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多