我有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  


通常如何解释输出?我认为<表示已删除,但3d25a5是什么意思?

如果我这样做: @@ -1,5 +1,5 @@是什么意思?

#1 楼

在您的第一个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行。

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

#2 楼

摘要:

给出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


评论


为了确保我理解这一点:如果要交换file1和file2,所有XaY都会变成YdX,XcY变成YcX,XdY变成YaX吗?

– BallpointBen
20-10-28在4:23



@BallpointBen更有可能列出的差异将按顺序更改。如果您只创建几个文件一起玩,就会更容易理解。

– terdon♦
20-10-28在12:20

#3 楼

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

如果您这样考虑Diff命令,则更容易理解:


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


以下每种情况的解释都很好:


添加,c代表更改,d代表删除


#4 楼

重命名参数以帮助您记住正在发生的事情:

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

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


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

代表删除,但是'remove'更清楚地表示发生了什么,而......但'insert'则更清楚地表示发生了什么

使用如下:

2,4d1 --- D(s)-dN ---删除(“删除”)D行。然后在两个行中的N行进行同步。 br />注意:这两个参数几乎是对称的;只是从左向右反转。


Change ='删除并插入'。

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



例如:

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

2,4d1 ---删除行2-4(2、3和4)。

2,4c5,6 ---删除2-4(2、3和4)行,并插入更新的5-6(5和5)行6)。



*我知道这些是流编辑器命令,旨在由机器处理。例如,它实际上是ed命令add,而不是insert,但是对我而言,考虑insert到底对文件有多大帮助。

它们使用流操作,但我更倾向于从结果的角度考虑。*

#5 楼

我建议使用:

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

然后,当您阅读result.patch时,您会立即知道区别。

这些是命令行开关:

-r:递归

-u:显示行号

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

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