Linux diff与最小匹配

时间:2014-03-27 12:30:39

标签: linux diff match

我需要仅使用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可以胜任,但事实并非如此。它似乎发现更少的更改集而不是像我需要的更小的更改集。如果我在第一行之后插入一个只包含“ - ”的新行,它确实有效,但我必须比较的文件非常大,我真的不想在每行之间插入“ - ”。

1 个答案:

答案 0 :(得分:0)

由于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