Diff 报告差异,但两行内容相同

Diff 报告差异,但两行内容相同

我比较了两个文件,得到了

1c1
< 1
---
> 1

两个文件都只包含“1”。这有什么不同?

答案1

  • 第一行:a代表添加、d删除和c更改。原始文件的行号出现在这些字母之前,修改文件的行号出现在这些字母之后。

  • 第二行:<来自文件 1 且与文件 2 不同的行。

  • 第三行是分隔线。

  • 第四行:>来自文件 2 且与文件 1 不同的行。

    (如果你看到=它,则意味着两个文件中的行相同)

您的问题可能是空格或其他非人类可读的字符:这些也会引发差异。

有一些选项可以操纵输出。

例子:

$ more 1 
test
test2
test3
$ more 2
test
test2  
test3

上下文格式:

$ diff -c  1 2
*** 1   2011-08-13 17:05:40.433966684 +0200
--- 2   2011-08-13 17:11:24.369966629 +0200
***************
*** 1,3 ****
  test
! test2
  test3
--- 1,3 ----
  test
! test2  
  test3

A!表示两个文件中对应行之间的更改。A+表示添加一行,而空格表示未更改的行。补丁的开头是文件信息,包括完整路径和时间戳。每个块的开头是适用于文件中相应更改的行号。出现在三个星号之间的数字范围适用于原始文件,而三个破折号之间的数字范围适用于新文件。块范围指定相应文件中的起始和结束行号。

扩展Lekensteyn 关于统一格式的评论-u选项diff):

$ diff -u  1 2
--- 1   2011-08-13 17:05:40.433966684 +0200
+++ 2   2011-08-13 17:11:24.369966629 +0200
@@ -1,3 +1,3 @@
 test
-test2
+test2  
 test3

该格式以与上下文格式相同的两行标题开头,不同之处在于原始文件前面是---,而新文件前面是+++。 后面是一个或多个更改块,其中包含文件中的行差异。 未更改的上下文行前面有一个空格字符,添加行前面有一个加号,删除行前面有一个减号。

一些有用的选项:

  • -b:忽略空白量的变化。

  • -w:忽略所有空白。

  • -B:忽略所有空行。

  • -y:分2列输出。

答案2

我发现od(八进制转储)在比较具有不可打印字符的文件时非常方便(特别是那些diff确定是“二进制”的文件,因此只告诉您它们确实不同)。

在下面的例子中,我创建了一对可能与原始文件相似的文件,然后对原始输出进行差异比较;接下来,我对几个不同的od输出进行差异比较。

$ echo 1 > 1
$ echo "1 " > 2
$ diff 1 2
1c1  
< 1  
- ---  
> 1
$ od -c 1 > 1.od
$ od -c 2 > 2.od
$ diff 1.od 2.od
1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003
$ od -Ax -c -t x1 1 > 1.od
$ od -Ax -c -t x1 2 > 2.od
$ diff 1.od 2.od
1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003

答案3

其中一个文件可能是 DOS/Windows 格式,另一个可能是 UNIX 格式。因此,运行以下命令将 DOS 转换为 UNIX:

dos2unix <file1> <file2>

就我的情况而言,完成此操作后,差异就全部消失了!

答案4

不确定这是否有助于解决难以找到的空白字符,但你可能想要使用wdiff,的前端diff,方便进行差异化。您可以使用以下方式安装它:

sudo apt install wdiff

相关内容