我有一个源文件,其中包含两个相似但略有不同的部分。我想将这两个部分合并为一个子程序,其中一个参数可以处理微妙的差异,但我需要确保我都知道它们,所以我不会错过任何一个。
在这种情况下我通常做的是将每个部分复制到一个单独的文件,然后使用tkdiff或vimdiff突出显示差异。有没有办法跳过中间文件,只是区分同一个文件的两个部分?
答案 0 :(得分:5)
KDiff3是开源的,可在多个平台上使用,包括Win32和Linux。
它具有Gishu讨论的关于Beyond Compare的“手动对齐”功能(顺便说一下,我没有亲自使用它,但被我认识的许多人认为是一个很棒的工具)。
有关更多示例,请参阅this answer。
答案 1 :(得分:5)
Vim的linediff插件适合我。以可视方式选择文件的一个部分,然后键入:Linediff
。以视觉方式选择其他部分,然后键入:Linediff
。它会将vim置于vimdiff模式,仅显示您之前突出显示的两个部分。输入:LinediffReset
退出vimdiff模式。
更多信息:
答案 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将显示出来以进行比较。