Jim*_*Jim 145 linux diff files
我有 file1.txt
this is the original text
line2
line3
line4
happy hacking !
Run Code Online (Sandbox Code Playgroud)
和 file2.txt
this is the original text
line2
line4
happy hacking !
GNU is not UNIX
Run Code Online (Sandbox Code Playgroud)
如果我这样做:diff file1.txt file2.txt我得到:
3d2
< line3
5a5
> GNU is not UNIX
Run Code Online (Sandbox Code Playgroud)
通常如何解释输出?我认为这<意味着已删除,但做什么3d2或5a5意味着什么?
如果我做:
this is the original text
line2
line3
line4
happy hacking !
Run Code Online (Sandbox Code Playgroud)
结果更清楚了,但这@@ -1,5 +1,5 @@意味着什么?
Joh*_*ith 158
在您的第一个diff输出(所谓的“正常差异”)中,含义如下:
< - 表示 file1.txt 中的行
> - 表示 file2.txt 中的行
3d2并5a5表示受影响的行号以及执行了哪些操作。d代表删除,a代表添加(并c代表更改)。字符左边的数字是file1.txt中的行号,右边的数字是file2.txt中的行号。所以3d2告诉你 file1.txt 中的第 3 行被删除,并且在 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
Run Code Online (Sandbox Code Playgroud)
这里-表示从file1.txt 中删除+的行,表示添加的行。
ter*_*don 38
总结:
给定 a diff file1 file2,<表示在 中缺少该行,file2并>表示在 中缺少该行file1。该3d2和5a5可以忽略不计,它们是命令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...
Run Code Online (Sandbox Code Playgroud)
有三种类型的更改命令。每个都由第一个文件中的行号或逗号分隔的行范围、指示要进行的更改类型的单个字符以及第二个文件中的行号或逗号分隔的行范围组成。所有行号都是每个文件中的原始行号。更改命令的类型是:
`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
Run Code Online (Sandbox Code Playgroud)
1)重命名文件参数以帮助您记住发生了什么:
而不是:
diff f1 f2 # f1=file 1, and f2=file2
Run Code Online (Sandbox Code Playgroud)
思考
diff file-to-edit file-with-updates
Run Code Online (Sandbox Code Playgroud)
结果默认来自file-to-edit,更新来自file-with-updates。
2)此外,这些命令重命名可能会帮助您思考正在发生的事情:
d代表d elete,但“删除”更清楚发生了什么
一个代表一个DD,......但是“插入”更清楚发生了什么
c代表c hange = d + a或“删除 + 插入”。
像这样使用:
2,4 d 1 或一般 D(s)- d -N = d elete (' remove ') D line(s)。然后在两者中的第 N 行同步。
4 a 2,4 或一般情况下 N- a -U(s) = 在第 N 行,一个dd ('插入') 更新行 U。
注意:这两个参数几乎是对称的;只是从左到右颠倒了。
2,4 c 5,6 或一般的 R(s)- c -U(s) = 删除 R(s) 行,然后在它们的位置插入更新的行 U(s)。
例如:
4 a 2,4 表示从 4 开始,添加(插入)更新的第 2-4 行(即“2,4”表示第 2、3 和 4 行)
2,4 d 1 表示删除第 2-4 行(2、3 和 4)。
2,4 c 5,6 表示删除第 2-4 行(2、3 和 4),并插入更新的第 5-6 行(5 和 6)。
小智 7
我建议使用:
diff -rupP file1.txt file2.txt > result.patch
然后,当您阅读时result.patch,您会立即知道其中的区别。
这些是命令行开关的含义:
-r:递归
-u : 显示行号
-p(小):显示 C 函数的差异
-P(大写):如果有多个文件,则显示完整路径
小智 5
上面的回答都很好。然而,作为初学者,我发现它们有点难以理解,在进一步搜索后,我发现了一个非常有用的链接: Linux Diff 命令和示例
该网站以简单易懂的方式解释了这个概念。
如果你这样考虑,Diff 命令更容易理解:
本质上,它会输出一组关于如何更改一个文件以使其与第二个文件相同的指令。
以下每种情况都得到了很好的解释:
a 表示添加,c 表示更改,d 表示删除