我比较了两个文件,得到了
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