如何比较两个文本文件并查看改动内容
比较两个文本文件最快的方法,是把两者都粘贴进一个并排显示的 diff 工具, 然后阅读它高亮出的行。绿色表示新增,红色表示删除,而改动的行会同时显示两者。 无需安装、无需上传,几秒钟就能完成。
这能覆盖大多数情况。但屏幕上读起来完全一样的两个文件,逐字节看仍可能不一致, 而这正是人们白白耗掉一个下午的地方。本指南会展示快捷方法、一个实例、 值得了解的看不见的差异,以及像 ChatGPT 这样的 AI 聊天机器人真正能派上用场的场合。 如果你只想要工具,我们的 文本比较页面可以在你的浏览器里完成整个过程。
"比较两个文本文件"到底是什么意思
文本文件是被拆成一行行的字符序列。比较两个文件,就是把匹配的部分对齐、 把不匹配的部分标记出来。做这件事的经典工具是 Unix 的 diff 工具,而包括我们在内的每一款现代 diff 查看器,都是用更友好的方式做同一件事。
大多数 diff 工具先按行工作。这让它们在长文件上保持快速,也符合人的阅读习惯: 你先扫视出移动过的行,再看行内部改动的词。我们的引擎构建在 Google 的 diff-match-patch 之上,它会在查看单个字符之前先跑一遍行模式,所以一千行的日志也能瞬间完成 diff。
比较两个文本文件的几种方法
没有唯一正确的方法。这取决于文件在哪里,以及你需要多精确。
| 方法 | 适合场景 | 精确吗? | 工作量 |
|---|---|---|---|
| 并排阅读 | 几行内容,一处明显的改动 | 由你来判断 | 低 |
| 在线 diff 工具 | 快速检查,随处粘贴 | 是,逐字符精确 | 低 |
命令行(diff、git diff) | 磁盘上的文件、脚本处理、超大文件 | 是 | 中 |
| 代码编辑器(VS Code "比较") | 已经在编辑器里打开的文件 | 是 | 低 |
| AI 聊天机器人(ChatGPT) | 用大白话概述改动 | 否,可能遗漏或改写 | 低 |
对一次性的检查来说,浏览器工具在速度上占优,因为没有东西要安装,你可以直接从邮件、 日志或代码评审里粘贴。对于已经在仓库里被跟踪的文件, git diff 就在手边。我们稍后会回到 AI 这个选项, 因为它在合适的场合确实有用,在不合适的场合则是个陷阱。
在浏览器中比较两个文本文件,分步操作
当有人发给你一份文档的两个版本、问"哪里不一样?"时,这就是你要走的流程。 大约十秒钟。
- 打开文本比较工具。
- 把原文粘贴到左侧,新版本粘贴到右侧。或者用上传直接从磁盘加载文件。
- 阅读高亮。新增行是绿色,删除行是红色,改动过的行显示为一红一绿的一对。
- 滚动查看改动的行。每一行内部会标出确切不同的词,这样你就不用重读整行。
- 如果两个文件看起来差异远大于本应有的程度,请跳到下面的看不见的差异一节。
一个实例
假设一位同事把编辑过的段落发回来,请你核对他们的改动。这是你的原文:
The service starts at 9am on weekdays.
Refunds are processed within 14 days.
Contact [email protected] for help.
这是他们的版本:
The service starts at 8am on weekdays.
Refunds are processed within 30 days.
Contact [email protected] for help.
Priority support is available on request.
把两者都放进 diff,真实的情况其实很简短,尽管在散文里很容易一扫而过:
| 行 | 之前 | 之后 | 改动 |
|---|---|---|---|
| 开始时间 | 9am | 8am | 已修改 |
| 退款期限 | 14 days | 30 days | 已修改 |
| 支持渠道 | [email protected] | [email protected] | 无改动 |
| 优先支持 | 无 | Priority support is available on request. | 已新增 |
两个数字变了,加了一句话。退款期限从 14 天翻倍到 30 天,正是那种你想在上线前抓住的改动, 而它离在快速阅读中隐形只差一个字符。这就是用 diff 处理文本、而不是相信自己眼睛的全部理由。
让人栽跟头的看不见的差异
有时 diff 会把屏幕上看起来完全相同的两个文件画成截然不同的样子。原因几乎总是一个你看不见的字符。 下面是常见的嫌疑对象。
| 看不见的差异 | 从何而来 | 该怎么办 |
|---|---|---|
| 换行符:CRLF vs LF | 一个文件保存在 Windows 上,另一个保存在 macOS 或 Linux 上 | 统一换行符;参见换行约定 |
| 行尾空白 | 留在行末的空格或制表符 | 去掉行尾空白,或在工具支持时忽略它 |
| 字节顺序标记(BOM) | 编辑器在第一行加了一个看不见的标记 | 保存为不带 BOM 的 UTF-8 |
| 制表符 vs 空格 | 不同的编辑器或缩进设置 | 选一种并转换;两者在屏幕上看起来一样 |
| 文本编码 | 一个文件是 UTF-8,另一个是 Latin-1,导致带重音的字符字节不同 | 把两者都重新保存为 UTF-8 |
| 不换行空格 | 从网页或字处理软件粘贴而来 | 查找并替换为普通空格 |
咬得最狠的是换行符。Windows 文件在每行末尾用回车加换行(CRLF);Mac 或 Linux 文件只用换行(LF)。 在同一个编辑器里打开两者,它们看起来一样,但每一行在字节层面都不同, 于是一个天真的 diff 会像圣诞树一样亮起来。如果整个文件都显示为已改动,请先查这一项。
ChatGPT 能比较两个文件吗?
能,而且现在很多人正是这么做:把两个版本粘进 ChatGPT (或另一个 AI 助手),问"改了什么?"对短文件来说效果不错,还能给你普通 diff 给不了的东西: 一段用日常语言写成的概述。"退款期限从 14 天变成了 30 天,并新增了一条优先支持", 对一位忙碌的读者来说,往往比一堵红绿相间的墙更有用。
问题在于精确度。语言模型不是 diff 算法。它可能漏掉一个字符的改动,在概述时悄悄改写某一行, 或在长文件上空间耗尽而跳过中间部分。这还意味着把你的文本交给第三方, 对任何敏感内容你可能都不愿意。所以这两类工具是互补的,而非对手。
一个好的工作流程:先把文件跑一遍确定性的 diff 工具,得到精确、逐字符准确的改动清单, 再把这份简短的清单粘进 AI 聊天机器人,让它用大白话解释影响。你既得到 diff 的准确, 又得到概述的可读性,而不必指望其中任何一方去做另一方的工作。
在命令行比较文件
如果文件已经在磁盘上,内置的
diff 命令只需一行:
diff old.txt new.txt
加 -u 得到 Git 使用的统一格式,或加 -w 忽略空白差异。
对仓库里的文件,git diff old.txt new.txt 做同样的事,并带颜色和词级高亮。
浏览器工具就是它的免终端版本:粘贴、阅读、完成。
相关工具
你要比较的很少只有纯文本。如果文件是结构化的,一个能理解格式的视图读起来更好: 比较 JSON 能处理重新排序的键和缩进噪声, 比较 CSV 能对齐行和列。在 diff 之前先清理一份杂乱的列表, 是 删除重复行和 行排序的活儿。
常见问题
- 在线比较文本文件会把它们上传到什么地方吗?
- 在 comparetext.org 上,比较是在你的浏览器里运行的。两个文件都由你自己机器上的 JavaScript 做 diff,所以除非你特意点击保存或分享,否则不会有任何内容被发送到服务器。这让它对草稿、合同、配置文件,以及任何你不愿粘进那种每敲一次键就上传的网站的内容,都是安全的。
- 为什么我的两个文本文件每一行都显示为不同?
- 几乎总是换行符的问题。一个文件保存在 Windows(CRLF)上,另一个保存在 macOS 或 Linux(LF)上,所以尽管看起来完全一样,每一行在字节层面都不同。第一行上一个隐藏的字节顺序标记(BOM),或制表符与空格之别,也会造成同样的结果。统一换行符,把两者都重新保存为 UTF-8,然后再做一次 diff。
- 我能不安装任何东西就比较两个文本文件吗?
- 可以。打开文本比较工具,把一个文件粘到左侧、另一个粘到右侧,或用上传从磁盘加载它们。diff 会即时出现,就在浏览器里,改动的行会被高亮。没有东西要下载,也不用创建账号。
- ChatGPT 能替我比较两个文件吗?
- 能,对短文件用大白话概述改了什么,它很方便。但语言模型不是 diff 算法:它可能漏掉一处小改动,在概述时改写某一行,或跳过长文件的中间部分。想要精确、逐字符准确的比较,请用 diff 工具,然后如果你想要文字解释,再把结果交给 AI。
- 我该如何比较两个文件并忽略空白?
- 在命令行上,
diff -w old.txt new.txt会忽略空白差异,而diff -b会忽略空白数量的变化。在浏览器里,粘贴之前先去掉行尾空格并统一换行符,因为那些正是最常把 diff 弄乱的空白改动。目标是只留下会改变含义的编辑。 - 比较文本和比较代码有什么区别?
- 机制是一样的:两者都对齐匹配的行、标出其余部分。区别在于什么算作真正的改动。在散文里,一段重新排版的文字可能看起来像一处大改动,其实只挪动了一个词。在代码里,缩进和被挪动的函数很重要。像 JSON 比较这样能理解格式的视图,或一个能理解语言的编辑器,能为结构化文件减少这种噪声。
想试试吗?把你的两个文件粘进 文本比较工具,看看改动了什么。