【发布时间】: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 line1和fooX line之间的相似性),因此find的“更改的行/块”的定义是“之前相等,之后相等”。仅当其中一个块为空时,“更改”才称为“插入”或“删除”。 -
man diff解释说--minimal将“努力寻找更小的变化集” 是指“更少的集合”还是“更小的集合”? (我需要 smaller 套,实际上我有 fewer 套) -
@Alfe:我从未说过预期的输出会“更好”,这正是我所需要的 :) 至于实际/预期的大小,请参阅我之前的评论,它取决于如何理解
man diff... -
“较小的更改集”与“较少的更改”相同。