Linux diff3命令示例

举报
Tiamo_T 发表于 2022/07/07 16:10:57 2022/07/07
【摘要】 在本文中,我们将通过一些示例来了解 diff3 命令的用法。

如您所知,Linux diff 命令比较两个文件。

然而,Linux diff3 实用程序比较三个文件,并且还能够将两个文件之间的差异合并到第三个文件中。在本文中,我们将通过一些示例来了解 diff3 命令的用法。

diff3 的基本语法是:

diff3 [OPTION]... MYFILE OLDFILE YOURFILE

1. 基本 Diff3 输出

对于这个例子,让我们使用这三个文件:parent.txt、your.txt 和 mine.txt。

$ cat parent.txt
Hello
This is parent file.

$ cat your.txt
Hello,
This is your file.

$ cat mine.txt
Hello
This is my file.

现在,如果 diff3 命令在这三个文件上运行:

$ diff3 parent.txt your.txt mine.txt
====
1:1,2c
  Hello
  This is parent file.
2:1,2c
  Hello,
  This is your file.
3:1,2c
  Hello,
  This is my file.

我们看到输出包含所有这三个文件的比较信息。在上面的输出中:

  • 第一行 '====' 表示所有三个文件都不同。
  • 接下来,行 '1:1,2c' 意味着对于作为 diff3 参数的第一个 (1:) 文件(在我们的例子中是 parent.txt),一到两个 (1,2) 范围内的行是不同的当与其他两个文件相比并且需要更改(c)时,这两行也显示在输出的下两行中。
  • 同样可以理解“2:1,2c”和“3:1,2c”。


2. 如果三个文件中有两个是相似的

对于此示例,假设文件 mine.txt 和 parent.txt 完全相同。


$ cat parent.txt
Hello
This is a file.

$ cat your.txt
Hello,
This is your file.

$ cat mine.txt
Hello
This is a file.

现在 diff3 运行在这三个文件上:

$ diff3 mine.txt parent.txt your.txt
====3
1:1,2c
2:1,2c
  Hello
  This is a file.
3:1,2c
  Hello,
  This is your file.

第一行 '====3' 表示这次文件编号 3 即 your.txt 与其他两个不同。这在输出中也可见。

3. 'c' 用于更改,而 'a' 用于附加

到目前为止,我们已经在输出中看到了一个字母“c”。此字母表示行/文本中所需的“更改”。如果出现字母“a”,则表示需要附加一行。

让我们再举一个例子:

$ cat mine.txt
Hi,

$ cat parent.txt
Hi,

$ cat your.txt
Hi,
This is your file.

现在对这三个文件执行 diff3:

$ diff3 mine.txt parent.txt your.txt
====3
1:1a
2:1a
3:2c
  This is your file.

上面的输出表明file3(即your.txt)中的更改需要附加到file1(mine.txt)和file2(parent.txt)中,以使所有三个文件都相似。或者,可以更改 your.txt 中的第二行 (c) 以使所有三个文件都相似。

4. 使用 -x 选项输出重叠变化

标志 -x 可用于输出导致重叠的更改。作为 diff3 的参数给出的文件名的顺序在这里很重要。例如 :

diff3 -x mine.txt parent.txt your.txt

意味着您要在 mine.txt 中合并将 parent.txt 变为 your.txt 的更改

让我们举个例子:

$ cat mine.txt
Hi,
This is your file.
hello

$ cat parent.txt
Hi,
This is your file.

$ cat your.txt
Hi,
This is your file.
bye

现在执行 diff3:

$ diff3 -x mine.txt parent.txt your.txt
3c
bye

所以我们看到
输出表明 mine.txt 的第三行必须更改为“再见”,以便合并将 parent.txt 转换为 your.txt 的更改

5. 使用 -e 选项输出未合并的更改

选项 -e 可用于将来自 parent.txt 到 your.txt 的非合并更改输出到 mine.txt。
考虑与上述示例相同的文件:

$ diff3 -e mine.txt parent.txt your.txt
3c
bye

所以我们看到输出显示了未合并的更改。

6.使用-m选项输出合并文件

可以使用 -m 选项生成包含所有三个文件内容的合并文件。例如,如果以下是三个文件:

$ cat mine.txt
Hi,
This is your file.
Hello

$ cat parent.txt
Hi,
This is your file.

$ cat your.txt
Hi,
This is your file.

现在如果 diff3 使用 -m 选项运行:

$ diff3 -m mine.txt parent.txt your.txt
Hi,
This is your file.
Hello

所以上面的输出显示了合并文件的内容,该文件已经合并了作为参数提供给 diff3 的所有三个文件的内容。

7. 使用 -m 选项了解冲突

生成一个合并文件(从三个文件)并不总是小菜一碟(如上例所示)。

考虑下面的输入文件内容:

$ cat parent.txt
Hi,
This is your file.
hi

$ cat your.txt
Hi,
This is your file.
hello

$ cat mine.txt
Hi,
This is your file.
Hello

如果 diff3 在上述文件上运行,则会显示以下输出:

$ diff3 -m mine.txt parent.txt your.txt
Hi,
This is your file.
<<<<<<< mine.txt
Hello
||||||| parent.txt
hi
=======
hello
>>>>>>> your.txt

这里的前两行是合并文件中无可争议的部分,但实际冲突显示在 <<<<<<< 和 >>>>>>> 以及文件名和内容之间。

8. 使用“-”从标准输入接受一个参数

可以使用“-”代替任何一个文件名,以接受来自标准输入的该参数的输入。

$ diff3 mine.txt parent.txt -
Hi,
bye====3
1:1a
2:1a
3:2c
  bye

我们可以看到,当上面的命令运行时,第三个文件的内容是通过 stdin 给出的。请注意,从标准输入输入文件内容后,需要按组合键 ctrl+d 才能获得 diff3 的输出。

9. diff3 使用 diff 工具比较文件

虽然 diff3 吹嘘比较 3 个文件,但实际上它在内部使用 diff 工具来进行两个文件之间的比较。这可以通过传递一个可执行文件作为输入参数来确认:

$ diff3 mine.txt parent.txt a.out
diff3: subsidiary program `diff' failed

所以我们可以在上面的输出中看到,diff3 命令错误输出说明辅助程序“diff”失败。

10.通过-diff-program选项指定一个diff程序

diff3 命令提供了将 diff 程序作为参数提供的灵活性,以便可以使用相同的程序来比较文件并提供 diff3 可以使用的结果。此功能是通过使用 –diff-program 选项来实现的。

$ diff3 --diff-program=diff mine.txt parent.txt your.txt
====
1:2a
2:3c
  c ya
3:3c
  TC

11. 使用 -a 选项将所有文件视为文本

正如您在上面显示的示例 9 中看到的,当我们传递一个非文本文件(一个可执行的 a.out)时,diff3 返回错误。但是如果我们想告诉 diff3 甚至比较非文本文件,那么可以使用选项 -a 告诉 diff3 将所有输入文件视为文本文件。例如 :

$ diff3 -a mine.txt parent.txt a.out
====
1:1,2c
  Hello
  This is file
2:1,3c
  Hello
  This is file
  c ya
3:1,4c
  

因此,上面的输出表明 diff3 甚至尝试比较将其视为文本文件的可执行文件。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。