如何区分同一文件的两个部分?

时间:2009-01-12 08:11:08

标签: linux language-agnostic diff

我有一个源文件,其中包含两个相似但略有不同的部分。我想将这两个部分合并为一个子程序,其中一个参数可以处理微妙的差异,但我需要确保我都知道它们,所以我不会错过任何一个。
在这种情况下我通常做的是将每个部分复制到一个单独的文件,然后使用tkdiff或vimdiff突出显示差异。有没有办法跳过中间文件,只是区分同一个文件的两个部分?

7 个答案:

答案 0 :(得分:5)

KDiff3是开源的,可在多个平台上使用,包括Win32和Linux。

它具有Gishu讨论的关于Beyond Compare的“手动对齐”功能(顺便说一下,我没有亲自使用它,但被我认识的许多人认为是一个很棒的工具)。

manual alignment example 有关更多示例,请参阅this answer

答案 1 :(得分:5)

Vim的linediff插件适合我。以可视方式选择文件的一个部分,然后键入:Linediff。以视觉方式选择其他部分,然后键入:Linediff。它会将vim置于vimdiff模式,仅显示您之前突出显示的两个部分。输入:LinediffReset退出vimdiff模式。

更多信息:

https://unix.stackexchange.com/a/52759/32477

https://superuser.com/a/414958/199800

答案 2 :(得分:4)

我使用Beyond Compare 它允许您选择每侧的一条线并说“手动对齐”。这应该对你有用。

答案 3 :(得分:3)

我选择将@ ordnungswidrig的答案重写为bash函数(我只对单个文件的差异感兴趣,但这可以轻松更改为处理两个不同的文件......):

# find differences within a file giving start and end lines for both sections
function diff_sections {
  local fname=`basename $1`;
  local tempfile=`mktemp -t $fname`;
  head -$3 $1 | tail +$2 > $tempfile && head -$5 $1 | tail +$4 | diff -u $tempfile - ;
  rm $tempfile;
}

你这样称呼函数...... diff_sections path/to/file 464 483 485 506

答案 4 :(得分:1)

任何可以让您手动调整对齐的差异工具都可以完成这项工作。漫反射(http://diffuse.sourceforge.net/)是我的最爱,它还允许您手动调整对齐。

答案 5 :(得分:0)

如果您可以描述要使用正则表达式进行比较的部分的开头和结尾,您可以使用以下内容:

sh -c 't=`mktemp`; cat "$0" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 > $t; cat "$1" | grep -e "$2" -A10000 | grep -e "$3" -B 10000 | diff -u $t - ; rm $t' firstfile secondfile "section start" "section end"

作为替代方案,如果您想逐行描述,您可以这样做:

sh -c 't=`mktemp`; cat "$0" | head -$3 |tail +$2 > $t; cat "$1" | head -$5 | tail +$4 | diff -u $t - ; rm $t' first second 4 10 2 8

4 10 2 8是从第一个文件和第二个文件中考虑的部分的起始和结束行号。

您可以将代码段保存为shell脚本或别名。

答案 6 :(得分:0)

Emacs为此提供了ediff-regions-wordwise-您可以使用两个缓冲区(或只有一个),并在每个缓冲区中选择一个区域,然后ediff将显示出来以进行比较。