如何比较同一文件中的两个部分?

13

我有一个源文件,其中有两个相似但略有不同的部分。我想将这两个部分合并为一个子程序,并使用一个参数处理微小的差异,但我需要确保我意识到了它们,这样我就不会错过任何一个。
在这种情况下,我通常会将每个部分复制到单独的文件中,然后使用tkdiff或vimdiff来突出显示差异。是否有办法跳过中间步骤,直接比较同一文件的两个部分?

7个回答

10

6

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

它具有Gishu所讨论的“手动对齐”功能,该功能也被Beyond Compare所采用(顺便说一下,我个人没有使用过Beyond Compare,但许多我认识的人认为这是一个很好的工具)。

manual alignment example 更多示例请参见此答案


4

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

# 查找文件中给定起始和结束行之间的差异
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


2
diff -u <(head -$3 $1 | tail -n +$2) <(head -$5 $1 | tail -n +$4) - Alexander Bird

4
我使用Beyond Compare。它允许您在每一侧选择一行并说“手动对齐”。这对您来说应该可以正常工作。

谢谢!我通常在Linux上工作,但可以使用Samba从Windows机器访问我的NFS文件。我会尝试一下。是否有任何原生于Linux的工具可以做到同样的事情? - Nathan Fellman
从一些谷歌搜索来看,BC v3似乎可用于Linux。正如某人所说:“BC值得为Windows启动盒子” :) http://www.scootersoftware.com/moreinfo.php?zz=kb_linux - Gishu
1
如果各个部分足够接近,手动对齐效果很好,但有时候可能会觉得很繁琐,需要不断调整以避免匹配到某一行然后跳过大段文本来重新对齐文件。然而,它并不需要显式的文件,你可以直接复制粘贴(使用ctrl-shift-v)到一个新的“文本比较”标签页中。(BC是我用过的最好的文件差异工具。) - dash-tom-bang

1

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


0

Emacs有逐词比较区域功能 -- 你可以选择两个缓冲区(或只选择一个),并在每个缓冲区中选择一个区域,ediff将显示这些区域以进行比较。


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 脚本或别名。


第二个不起作用..你不能这样跟踪..需要一个-n - Engineer2021

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接