13

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

4

7 回答 7

10

Vim的linediff插件很适合我。直观地选择文件的一部分并键入:Linediff. 直观地选择其他部分并键入:Linediff。它会将 vim 置于vimdiff模式,仅显示您之前突出显示的两个部分。键入:LinediffReset以退出 vimdiff 模式。

更多信息:

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

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

于 2015-12-10T18:12:37.623 回答
6

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

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

手动对齐示例 有关更多示例,请参见此答案

于 2009-01-12T12:30:41.897 回答
4

我使用超越比较
它允许您在每一侧选择一条线并说“手动对齐”。这对你来说应该很好。

于 2009-01-12T08:17:43.543 回答
4

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

# 查找文件中的差异,给出两个部分的开始行和结束行
功能 diff_sections {
  本地 fname=`basename $1`;
  本地临时文件=`mktemp -t $fname`;
  头 -$3 $1 | 尾 +$2 > $tempfile && 头 -$5 $1 | 尾 +$4 | 差异 -u $tempfile - ;
  rm $临时文件;
}

你像这样调用函数...... diff_sections path/to/file 464 483 485 506

于 2010-01-11T21:03:33.433 回答
1

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

于 2009-01-14T18:20:10.787 回答
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 脚本或别名。

于 2009-01-12T09:22:55.207 回答
0

Emacs 有ediff-regions-wordwise —— 你可以取两个缓冲区(或只一个)并在每个缓冲区中选择一个区域,然后 ediff 将显示该区域以进行比较。

于 2019-02-07T01:41:54.683 回答