了解差异输出


87

我有 file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

如果我这样做:diff file1.txt file2.txt我得到:

3d2  
< line3  
5a5  
> GNU is not UNIX  

一般如何解释输出?我认为这<意味着删除,但什么3d2或者5a5是什么意思?

如果我做:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

结果更清楚,但这@@ -1,5 +1,5 @@意味着什么?

Answers:


96

在您的第一个diff输出(所谓的“ normall diff”)中,含义如下

< -表示file1.txt中的行

> -表示file2.txt中的行

3d25a5表示受影响的行号以及执行了哪些操作。d代表删除,a代表添加(c代表更改)。字符左侧的数字是file1.txt中的行号,右侧的数字是file2.txt中的行号。因此,3d2告诉您file1.txt中的第三行已删除,并且file2.txt中具有行号2(或者最好说删除后,行计数器又回到了行号2)。5a5告诉您,我们从file1.txt中的第5行开始(我们在上一个操作中删除了一行后实际上为空),添加了该行,而这行添加的是file2.txt中的第5行。

diff -u命令的输出格式略有不同(所谓的“统一差异”格式)。在此diff向我们显示了单个文本,而不是两个单独的文本。在该行中,@@ -1,5 +1,5 @@该部分-1,5与file1.txt有关,而该部分+1,5与file2.txt有关。他们告诉我们,diff它将显示一段文本,从file1.txt中的第1行开始,有5行长。与file2.txt相同- diff向我们显示了从第1行开始的5行。

正如我已经说过的,两个文件中的行一起显示

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

这里-表示从file1.txt中删除+的行,并表示添加的行。


25

总结

给定a diff file1 file2<表示该行缺少,file2并且>表示该行缺少file1。该3d25a5可以忽略不计,它们是命令patch通常与使用哪种diff

完整答案

许多* nix实用程序提供TeXinfo手册以及更简单的man页面。info command例如,您可以通过运行来访问它们info diff。在这种情况下,您感兴趣的部分是:

2.4.2普通格式的详细说明


正常的输出格式由一个或多个大块差异组成。每个块显示一个文件不同的区域。普通格式的块看起来像这样:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

更改命令有三种类型。每个文件都由第一个文件中的行号或逗号分隔的范围,表示更改内容的单个字符以及第二个文件中的行号或逗号分隔的范围组成。所有行号都是每个文件中的原始行号。更改命令的类型为:

`LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, `8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

`FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, `5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

`RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been

4

我建议使用:

diff -rupP file1.txt file2.txt > result.patch

然后,当您阅读时result.patch,您会立即知道它们之间的区别。

这些是命令行开关的含义:

-r:递归

-u:显示行号

-p(小):显示C函数的差异

-P(大写):如果有多个文件,则显示完整路径


3

上面的答案是好的。但是,作为一个初学者,我发现它们有点难以理解,并且在进一步搜索后,我发现了一个非常有用的链接: Linux Diff命令与示例

该站点以简单易懂的方式解释了该概念。

如果以这种方式考虑,Diff命令更容易理解:

本质上,它输出一组指令,说明如何更改一个文件以使其与第二个文件相同。

对以下每种情况进行了很好的解释:

a用于添加,c用于更改,d用于删除


2

重命名内容以帮助您记住!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

结果在要编辑的文件(file1)上进行操作,对其进行各种更新。


相似,我发现这些重命名有助于将结果概念化:

Delete ='删除'&Add ='插入'。

2,4d1 --- d(S) - d -N --- d elete( ' 删除 ')d线(S)。然后在两者的N行进行同步。

4a2,4 --- N- 一个 -U(S)---在行N,一个 DD( ' 插入 ')更新的线(S)U

注意:它们几乎是对称的。


更改='删除并插入'。

2,4c5,6 --- R(s)-c -U(s)---删除R(s)行,然后在其位置插入更新的U(s)行。



例如:

4a2,4 ---从4开始,添加更新的第2-4行(即2,4表示2、3和4)

2,4d1 ---删除第2-4行。

2,4c5,6 ---删除第2-4行,并插入更新的第5-6行


  • 我知道这些是流编辑器命令,旨在由计算机处理。例如,它实际上是ed命令add,而不是insert,但是对我而言,插入最终是对文件执行的操作对我来说更有用。他们使用流操作,但我喜欢从结果的角度考虑。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.