Text-Processing

我該如何理解diff輸出的統一格式?

  • April 2, 2022

來自diffutils 的手冊

接下來是一大堆差異;每個大塊顯示文件不同的一個區域。統一格式大塊看起來像這樣:

@@ from-file-line-numbers to-file-line-numbers @@
line-from-either-file
line-from-either-file...

如果一個大塊只包含一行,則只顯示其起始行號。 否則它的行號看起來像’start,count’。一個空的大塊被認為是從大塊後面的行開始的。

如果一個大塊及其上下文包含兩行或多行,它的行號看起來像’start,count’。否則只顯示其結束行號。空大塊被認為在大塊之前的行處結束。

他們的意思是什麼?你能否舉一些例子來說明它們的意思?

特別是,我無法區分最後兩段中的案例之間的差異。他們似乎在談論相同的案例,但我懷疑他們沒有。

  • 第一段中的“如果”情況和第二段中的“否則”情況有什麼區別?
  • 第一段中的“否則”情況和第二段中的“如果”情況有什麼區別?

我懷疑第一段(你強調的兩段)試圖解釋from-file-line-numbers,而第二段試圖解釋to-file-line-numbers

我將忽略晦澀難懂的文本,並解釋 GNU 如何diff實現統一diff的 s (解決您問題的標題)。

diff -u <(printf "a\nb\nc\n") <(printf "a\n")

產生以下內容:

--- /proc/self/fd/11    2018-11-08 11:16:09.183611033 +0100
+++ /proc/self/fd/12    2018-11-08 11:16:09.184611029 +0100
@@ -1,3 +1 @@
a
-b
-c

(我將省略後續範例中的前兩行,因為它們不需要太多解釋。)

這表明我們的兩個“文件”不同,只有一組差異(“hunk”)。在一個統一的更新檔中,每個文件比較都由一對以---(“from”文件)和+++(“to”文件)開頭的行引入。在每個文件比較中,每個塊都以一行開頭和結尾引入@@。此行標識 from 和 to 文件中更改的位置。from 位置以-(不是後面的數字的一部分)開頭,to 位置以 . 開頭+。位置是一對數字:起始行和長度(如果為 1,則省略)。因此,在上面的更新檔中,我們進行了更改,將 from 文件中從第 1 行開始的三行轉換為 to 文件中從第 1 行開始的單行。

帥哥可以包含上下文,上面就是這種情況。預設情況下,diff包括三行上下文(如果可用);它還將合併上下文重疊的帥哥。如果在更改之前和/或之後沒有三行上下文,則減少上下文;因此,上面我們在更改之前只有一行上下文,之後沒有。此上下文被視為大塊中給出的更改的一部分,因此它有助於起始線和長度。

diff -u0 <(printf "a\nb\nc\n") <(printf "a\n")

說明了這一點:

@@ -2,2 +1,0 @@
-b
-c

這是相同的更改,但沒有上下文:因此,它被簡化為將從第 2 行開始的兩行轉換為從第 1 行開始的無行的更改。

最簡單的位置對應於改變單行的更新檔,沒有上下文:

$ diff -u0 <(printf "a\nb\nc\n") <(printf "a\nb\nd\n")
@@ -3 +3 @@
-c
+d

結合上下文,這將是

@@ -1,3 +1,3 @@
a
b
-c
+d

(上下文的用處是允許更新檔對與原始文件不完全匹配的“來自”文件保持有用。patch如果它在原始位置的一定距離。)

引用自:https://unix.stackexchange.com/questions/480443