雜記 › 技術筆記 › 兩段文字到底哪裡不一樣?線上逐行比對並高亮差異

兩段文字到底哪裡不一樣?線上逐行比對並高亮差異

去年大促前一天,我把本地調好的 nginx 設定同步到線上,只改了兩行。上線後連線數很快打滿,翻回設定檔用眼睛一行行掃,掃了近二十分鐘沒看出問題,最後是同事把兩份檔案並排貼出來才看到:第三十幾行有一句 worker_connections 64,而倉庫裡那份是 1024。我當時盯著的是自己改過的地方,對「看起來眼熟」的整塊內容完全沒有防禦。從那以後我給自己定了條規矩:只要是兩份文字要確認異同,就不再用眼睛比。這類需求比想像中頻繁——設定回滾、合約回傳、文案終稿、名單核對,本質都是同一件事。

一、哪些場景真的需要逐行比對

  • 設定與環境:本地/測試/線上三台機器的設定檔,或者同一個檔案改動前後的差異,重點是有沒有多出或被覆蓋的行。
  • 合約與文件:對方回傳的 Word 轉成純文字之後,看條款措辭被改動的位置,尤其是金額、期限、責任上限這類行。
  • 清單與名單:兩批匯出資料的增刪項,比如上下架商品 ID、訂閱使用者名單。
  • 程式碼與腳本:臨時改動自查、合併前核對,或者別人提交的修補是否只動了該動的部分。

這幾類的共同點是:差異數量少、位置隨機,但代價大。1024 變成 64 只是三個字元的事,肉眼在滿屏相似文字裡幾乎抓不到它。

二、四種辦法的代價對比

做法200 行文字大約耗時能看到什麼主要風險
肉眼上下捲動比對15–25 分鐘顯眼的大段增刪漏掉單字元改動,注意力先入為主
Word / 編輯器「尋找重複行」5–10 分鐘同一段文字內部重複不是兩份檔案之間的比較
命令列 diff2–5 分鐘逐行增刪,輸出精確要記參數、處理檔案路徑與換行符
瀏覽器裡貼上兩份文字逐行比對1–2 分鐘醒目標示的增刪行與行數統計需要先把兩邊都貼全,別漏貼

命令列 diff 的結果最嚴謹,但每次都要開終端機、找路徑、判斷該用哪個參數,臨時需求常常就卡在這一步。我的處理是把網頁版當作第一道篩查:文字比對左右各貼一版,新增行綠色、刪除行紅色,同時給出新增/刪除/修改的行數統計。那個統計數字很關鍵——它會告訴你「這次改動一共動了 17 行」,而我原本以為只有 2 行,數字對不上就說明改動本身失控了。

三、讓比對結果可信的四件前置工作

  1. 統一臉行符。Windows 端的 CRLF 和 Linux 端的 LF 一旦混在一起,逐行比對會把整份檔案判成「全刪全增」,幾百行紅綠毫無意義。這是新手最常見的誤報來源。
  2. 統一縮排。Tab 與 4 個空格混用會讓同一行內容看起來不同。比程式碼前先把兩邊縮排策略對齊,避免把格式差異誤讀成邏輯差異。
  3. 順序無關的內容先排序。兩份名單只是排列不同、集合完全一致時,先排序再看差異。文字排序去重可以按升冪整理並順便去重,排完再比,「假差異」能一下少掉大半。
  4. 比完再確認「數量」而不只是「位置」。把新增行數和刪除行數記下來和預期對照。改動 3 行的任務,結果統計是 40 行,一定要先解釋清楚這個差值再上線。

順帶說一句隱私:文件、合約和原始碼這類內容,我傾向選在瀏覽器本機完成比對的方案,不走伺服器端傳輸,也不用擔心內容被留存;這一點在選工具時比功能多寡更重要。

四、除了找不同,比對還能回答這些問題

  • 範本有沒有被改:把渲染結果和基準版本比,輸出是否只多了預期的變數。
  • 資料匯出是否穩定:同一份查詢兩次匯出的結果對比,行數應完全一致。
  • 字典/列舉是否漏項:新舊版欄位清單對比,新增欄位有沒有同步到文件。
  • 文案有沒有改過頭:初稿和終稿比一次,再配合字數統計看增減幅度是否超出約定範圍。

讀統計數字比讀醒目標示更快收斂。那次排查我給自己定了一條流程:比完先只看三個數——新增幾行、刪除幾行、改動幾行,再去看位置。預期只動 2 行而統計顯示 15 行時,先別讀內容,回去查換行符和縮排;確認基準乾淨之後,剩下的差異才是真實的改動。反過來說,如果統計只有「1 刪 1 增」,那基本就是某個值被改了,一眼就能定位到 worker_connections 這類單參數變更。

散文類文字要單獨對待。從 Word 或 PDF 裡複製出來的段落帶的是版面軟換行,同一句話在兩份檔案裡可能落在不同的行上,逐行比對會把整段標成「全刪全增」。我的處理是把文件變成「一段一行」再比:犧牲排版資訊,換來差異位置準確;比對結論只用來判斷「改了哪幾句」,排版層面的確認還是回到原文裡看。

五、常見疑問

Q:文字比對和 git diff 有什麼區別?

原理一致,都以行為單位。git diff 依賴倉庫和提交歷史,能告訴你「這次提交改了什麼」;網頁版不依賴版本庫,任何兩份隨手能拿到的文字都能比,適合線上檔案和本地副本、別人寄來的附件這類沒有共同歷史的情境。

Q:一段文字裡只改了一個字,會怎麼顯示?

逐行比對是「行」的粒度,那一行有變化就整行標記。所以整行看不出到底改了哪個字元,需要把兩行單獨拎出來比,或者借助按字元拆分的工具。

Q:幾千行的文字能比嗎?會很慢嗎?

可以。真正影響體驗的不是行數而是差異數量:一份 3000 行但只改 5 行的檔案比 300 行改了 200 行的檔案更容易讀。差異過多時,先做前面說的排序和格式統一,把雜訊壓下去。

Q:貼上的內容會被上傳儲存嗎?

這取決於具體工具。我用的這種是在瀏覽器本機完成比對,文字不發往伺服器端,處理合約和原始碼時更放心。判斷方法是開啟開發者工具的網路面板,看比對過程中有沒有新的請求發出。

Q:兩份文件格式不同(Word 和 PDF)怎麼辦?

先都轉成純文字再比,重點保證段落換行位置接近,否則同一句話被拆成不同行數會產生大量假差異。轉換後先掃一眼行數是否在同一量級,再進入比對。

大促那次之後,我把「改設定必須做一次前後對比」寫進了發布清單,成本是十幾秒。真正讓我改習慣的不是這個動作本身,而是那二十分鐘肉眼掃描給了我一個結論:人對「眼熟的整塊內容」完全沒有抵抗力,差異必須靠機器標出來才看得見。

📎 相關文章

PNG 壓了三遍只減 426 位元組:無損壓縮的真實邊界 2026-10-22 WebP 轉 PNG 後體積漲了幾倍:什麼時候必須轉,怎麼把漲幅壓住 2026-10-22 截圖縮到四分之一,小字糊成一團的三種原因 2026-10-22 同樣裁 300×300,頭像為什麼總偏右下角半格 2026-10-22 按每月 1.7 倍預估 18 個月,腳本和表格為什麼給出兩個數 2026-10-22