diff 两个文件与切换行的结果表示两次丢失同一行

Gee*_*eek 28 diff

我试图了解两个文件上的 linux diff 命令,它们的行只是彼此的排列,但无法理解它生成的输出。考虑以下三个命令:

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Run Code Online (Sandbox Code Playgroud)

有人可以解释上述 diff.c 的神秘输出吗?

  1. 为什么输出中根本没有提到“橙子”?
  2. 是什么1d02a2意味着什么?

从这个答案中了解到:

“<”表示文件 2 中缺少该行,“>”表示文件 1 中缺少该行

但这并不能解释为什么输出中缺少橙子。

cha*_*aos 27

要理解报告,请记住这diff是规定性的,描述了需要对第一个文件 ( file1) 进行哪些更改才能使其与第二个文件 ( file2) 相同。

具体来说,din1d0表示删除ain2a2表示添加

因此:

  • 1d0表示第 1 行必须在file1( apples) 中删除。0in1d0表示第 0 行是如果file2它们没有被删除,它们将出现在第二个文件 ( ) 中的位置。这意味着当更改file2file1(向后)时,file1在 .0 的第 0行之后追加第 1行file2
  • 2a2表示将第二行 ( oranges) from附加file2到现在的第二行file1(删除 中的第一行后file1oranges切换到第 1 行)


pol*_*lym 13

考虑这些文件:

file1

# cat file1
apples
pears
oranges
peaches
Run Code Online (Sandbox Code Playgroud)

file2

# cat file2
oranges
apples
peaches
ananas
banana
Run Code Online (Sandbox Code Playgroud)

怎样diff的作品,给了它是基于订单:

  1. diff读取file1and的第一行块file2,并尝试找到相等的行:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
    Run Code Online (Sandbox Code Playgroud)
  2. 现在它将跳过两个文件中所有相等的行,oranges在这种情况下:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在找到另一组相似的行并打印出差异:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
    Run Code Online (Sandbox Code Playgroud)
  4. 跳过类似的行

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果可能,查找相同的行,并打印差异:

    line_file1    file1    line_file2    file2        differences on left (<) or right side (>)
             1    apples                              <apples 
             2    pears                               <pears 
             3    oranges           1    oranges
                                    2    apples       >apples
             4    peaches           3    peaches
                                    4    ananas       >ananas
                                    5    banana       >banana
             -----------------------------------------------
    
    Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做diff file1 file2

# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana
Run Code Online (Sandbox Code Playgroud)

现在很容易解释diff输出的含义:

使file1等于file2

  • 1,2d0删除d)线1-2file1和修改线0file2相应
  • 3a2追加a),以线3file1线2file2
  • 4a4,5追加到线4file1线4-5file2

diff比较file1file2由在临时存储器线并稳定差异线。在使file1 等于 file2直到第一次出现在 中的行之后file1,也出现在 中file2,直到差值之前相等的所有行都不会被提及,通常表示为---。在这种情况下,只有一个类似的行,即oranges。请注意,我说的是file1等于file2,所以file1是相对的file2而不是相反的。

输出与给定的第一个文件有关,在本例中为file1.

  • 我不喜欢最初的解释:`apples` 也出现在两个文件中。 (2认同)

小智 8

他们是:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 8

标准(旧)输出格式将显示文件之间的差异,而不会显示文件不同区域的周围文本。

例如:1d0 <(delete) 表示需要从 的第一行删除苹果file12a2 >(append) 表示需要将苹果添加到file22nd 行,这样两个文件就可以匹配了。

提供的文档info diff进一步解释了它:

在没有上下文的情况下显示差异

“正常”diff输出格式显示了每一块差异,没有任何周围的上下文。有时,这样的输出是查看行如何变化的最清晰方式,没有附近未更改行的混乱(尽管您可以通过使用 0 行上下文获得与上下文或统一格式类似的结果)。但是,这种格式不再广泛用于发送补丁;为此,上下文格式和统一格式是优越的。正常格式是与旧版本diff和 POSIX 标准兼容的默认格式。使用该--normal选项可明确选择此输出格式。

普通格式详解

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

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...
Run Code Online (Sandbox Code Playgroud)

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

LaR 在第一个文件的 L 行之后添加第二个文件的 R 范围内的行。例如,8a12,15表示在文件 1 的第 8 行之后追加文件 2 的第 12-15 行;或者,如果将文件 2 更改为文件 1,则删除文件 2 的第 12-15 行。

FcT 将第一个文件范围 F 中的行替换为第二个文件范围 T 中的行。这就像添加和删除的组合,但更紧凑。例如,5,7c8,10表示将文件 1 的第 5-7 行更改为文件 2 的第 8-10 行;或者,如果将文件 2 更改为文件 1,请将文件 2 的第 8-10 行更改为文件 1 的第 5-7 行。

RdL 从第一个文件中删除 R 范围内的行;如果它们没有被删除,L 行是它们出现在第二个文件中的位置。例如,5,7d3表示删除文件 1 的第 5-7 行;或者,如果将文件 2 更改为文件 1,则将文件 1 的第 5-7 行附加到文件 2 的第 3 行之后。

也可以看看:


因此,要查看橘子,您必须并排或使用统一上下文对其进行区分。

例如:

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
Run Code Online (Sandbox Code Playgroud)