文本差异怎么对比?改了什么一眼看出
一、行级 diff 的最小单位是「整行」
把
a
b
c
改成
a
B
c
结果不是「第 2 行改了」,而是:
| 类型 | 内容 |
|---|---|
| 相同 | a |
| 删除 | b |
| 新增 | B |
| 相同 | c |
统计:新增 1、删除 1、相同 2、差异 2 处、相似度 66.67%。
为什么改一行算两条:行级 diff 不判断「这一行被编辑了」,只判断「这一行在或不在」。改动一行 = 旧行消失 + 新行出现,所以显示成删除与新增两条。git diff、代码评审工具都是这个表示法——理解这点就不会误以为「我只改了一行,为什么提示两处改动」。
二、相似度是怎么算的
相似度 = 相同行数 × 2 ÷(左边行数 + 右边行数)× 100%
本质是「1 减去差异行占比」,对两段长度不同的情况也成立。三行里 2 行相同 → 2×2 ÷ (3+3) = 66.67%;完全相同 → 100%;毫无交集 → 0%。
这个指标适合快速判断改动规模:合同改版相似度 98% 说明只动了几个字,相似度 60% 就意味着大段重写。
三、三种比较口径的取舍
| 口径 | 效果 | 什么时候用 |
|---|---|---|
| 严格比较 | 空格差异也算改动 | 代码缩进、Markdown 列表、配置文件 |
| 忽略空白 | 行内空格与制表符差异视为相同 | 从网页复制的文本、对齐格式不同 |
| 忽略大小写 | Hello 与 hello 视为相同 | 英文大小写不敏感的字段 |
实测对比同两段文本:
| 口径 | 相似度 |
|---|---|
b vs b 严格比较 | 50.00% |
b vs b 忽略空白 | 100.00% |
Hello vs hello 忽略大小写 | 100.00% |
忽略空白有风险:Python 代码的缩进、YAML 的层级、Markdown 的嵌套列表,缩进本身就是内容。忽略空白后显示「完全相同」,但程序跑起来结果不同——工具仍有原文对照,但你别只看「100% 相同」就下结论。
一个细节:忽略空白只影响「比较键」,输出里仍然显示原文(保留前导空格),这样你能看到差异到底在哪。
四、这些场景最实用
- 合同与协议对比:改版后快速定位「哪几条被动了」,比逐字读快得多;
- 配置与代码评审:上线前对比新旧配置;注意缩进敏感的格式用严格比较;
- 文章与稿件:编辑改完稿子,作者想知道动了哪些地方;
- 数据核对:两份导出的名单、两版价格表对比。
行级对比的局限:如果整段文字只改了一个字,行级 diff 会把整行标成「删除 + 新增」,你会看到很长的一行红绿对照。这时用字符级对比更直观——它在行内标出具体哪几个字变了。大改版用行级、小修改用字符级,是效率最高的组合。
五、对比前先做两件清理
- 统一换行符:Windows 的 CRLF 与 Linux 的 LF 会让「每一行都不同」,对比前先统一,否则相似度会低到离谱;
- 清理零宽字符与全角空格:从网页或聊天窗口复制的内容常混入不可见字符,会把原本相同的行判成不同行(详见零宽字符清理与全角半角转换)。
六、直接算
→ 文本差异对比:行级与字符级对比,支持忽略空白与大小写
→ 字数统计:中英文字数与行数统计
→ 文本处理工具:去空行、批量替换等对比前的清理
本站文章为个人使用经验的原创整理,除已注明来源的引用外均为本人撰写。文中涉及的软件名称、商标、截图等归各自权利人所有,引用仅用于说明与交流。如认为本站内容侵犯了你的合法权益,请通过「关于本站」页面的联系方式告知,核实后将及时更正或删除。