SheepDev

文字與正規表示式

只查看文字或設定檔的修改處

使用工具

憑眼睛掃描長設定容易漏掉修改,而滿螢幕新增和刪除又會讓小修改顯得巨大。找到差異與判斷意義是兩件事。先選比較單位,再把注意力集中到要理解的變化。

文字差異比較兩個原始字串,不執行設定,也不判斷語意等價。固定左側為修改前、右側為修改後,從小例子理解顯示,避免把新增說成刪除。

30 改成 60,為什麼出現兩項變化?

修改前
host=example.invalid
timeout=30
retries=3
修改後
host=example.invalid
timeout=60
retries=3

行模式會顯示刪除 timeout=30、增加 timeout=60。人眼的一處修改,可以表示為刪舊行、插新行。新增一行加刪除一行,不等於修改了兩個設定項;數量描述比較單位,不是需求或操作次數。

左右互換會反轉新增與刪除。分享結果時應標明哪個是舊版本。只保留變化片段可能遺失上下文或單位,審查時還要能看到附近行和說明。

長行變化,再按字元細看

切換字元模式,會看到刪除 3、增加 6。行模式找哪一行,字元模式找行內哪裡。長 URL、CSV 一行或說明中的數字發生變化時,先按行縮小範圍,再看字元更易讀。

越細不一定越清楚。整段重寫可能留下分散的相同字元與碎片差異。這是計算出的對齊,不是作者實際編輯歷史。大幅改寫時,應讀完整段理解意圖。

忽略空白後,消失的是什麼差異?

分別放在左右比較:僅行首空白不同
  timeout=30
timeout=30

行模式忽略空白可隱藏行首與行尾空白差異。把範例兩行分開輸入,再切換設定。它不會刪除所有內部空白,hello world 與 helloworld 仍不同。報告相同時,應說明忽略了什麼。

對空白有意義的格式,差異消失本身可能是警訊。YAML 縮排、對齊表格和固定寬度紀錄都可能因空白變化而改變意義。可暫時忽略以減少雜訊,但最後應關閉該選項再檢查;它不證明修改正確。

看似每行都變了,先檢查換行

文字沒變卻有大量差異,可能來自換行格式或最後換行。A 與 A 後跟換行是不同字串。編輯器或貼上過程可能統一換行,所以瀏覽器中相同不證明原檔案逐位元組一致。

排查時不要用格式化副本覆蓋原文。保留兩份原始版本,逐項改變最後換行、縮排或行序。多項同時變化會掩蓋差異消失的原因。應區分顯示更乾淨與確實沒有變化。

移動一行,可能顯示為刪除加新增

只是重排清單,即使各行都還在,文字比較也會產生變化。工具不一定把重新定位概括成一次移動。重複文字的對齊還可能不同於想像中的編輯順序,不應只憑差異形狀斷定操作過程。

如果關心成員而不是順序,可用清單集合運算;比較 JSON 鍵順序之外的值,可用結構比較。但步驟和優先規則的順序本身有意義。應按問題選工具,不要為了減少差異先排序。

目標是解釋差異,而不是差異歸零

審查時固定前後方向,先掃行,再檢查重要行中的字元。用過空白過濾,就在最後關閉複查。能說明「timeout 從 30 變為 60,其餘值相同」,比只看彩色片段更有用。

沒有差異時也要檢查範圍是否足夠:漏貼行、其他設定檔或環境變數若未輸入,就無法檢查。有差異也不自動等於缺陷。意圖與執行影響仍需規格和相應測試確認。

格式與內容一起修改,會讓審查更困難

整個設定重縮排時又把 timeout 從 30 改 60,大量變化會淹沒關鍵值。先比較原文,再觀察空白選項消除了什麼。本工具不刪除所有行內空白,因此仍有差異未必是錯誤,應明確忽略設定的範圍。

忽略後差異消失,不代表空白沒有意義。YAML 縮排、字串內容和 Markdown 換行可能改變行為。比較選項只是換一個審查角度,不是安全認證。條件允許時,將純格式修改與值修改分階段檢查,意圖更清楚。

分享差異時註明哪邊是修改前後、忽略了哪些內容。左右交換會顛倒增刪。寫 timeout 從 30 改 60,縮排已另行檢查,比僅說一處差異更有用。目標是核對意圖與實際修改,而不是減少紅綠標示。

參考資料

使用工具

指南 →