我有一个源文件,其中有两个相似但略有不同的部分。我想将这两个部分合并为一个子程序,并使用一个参数处理微小的差异,但我需要确保我意识到了它们,这样我就不会错过任何一个。
在这种情况下,我通常会将每个部分复制到单独的文件中,然后使用tkdiff或vimdiff来突出显示差异。是否有办法跳过中间步骤,直接比较同一文件的两个部分?
我有一个源文件,其中有两个相似但略有不同的部分。我想将这两个部分合并为一个子程序,并使用一个参数处理微小的差异,但我需要确保我意识到了它们,这样我就不会错过任何一个。
在这种情况下,我通常会将每个部分复制到单独的文件中,然后使用tkdiff或vimdiff来突出显示差异。是否有办法跳过中间步骤,直接比较同一文件的两个部分?
对于我来说,Vim的linediff插件效果很好。可视化选择文件的一个部分,然后键入:Linediff
。再选择另一部分并键入:Linediff
。它将进入vimdiff模式,只显示您之前突出显示的两个部分。输入:LinediffReset
以退出vimdiff模式。
更多信息:
KDiff3是开源软件,可在多个平台上使用,包括Win32和Linux。
它具有Gishu所讨论的“手动对齐”功能,该功能也被Beyond Compare所采用(顺便说一下,我个人没有使用过Beyond Compare,但许多我认识的人认为这是一个很好的工具)。
更多示例请参见此答案。
我选择将@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
ctrl-shift-v
)到一个新的“文本比较”标签页中。(BC是我用过的最好的文件差异工具。) - dash-tom-bangsh -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
diff -u <(head -$3 $1 | tail -n +$2) <(head -$5 $1 | tail -n +$4)
- Alexander Bird