Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

sed -i 在 Linux 可用、macOS 失敗?修改前先證明參數邊界

辨識 sed 實作與精確 argv,預覽轉換,再選擇明確的備份或暫存檔替換政策。

zh-TW sed argument boundary diagram
原創編輯插畫: verify the sed implementation and argument boundary. Watch at Ease

sed -i 在 Linux 成功而在 macOS 失敗時,關鍵證據不只是畫面上的命令。GNU 與 BSD 系 sed 對 in-place 後綴有不同定義,shell 也決定實際 token。

先保留來源、確認實作並預覽 stdout,再測試明確的備份或替換分支,避免可移植性修正變成破壞性編輯。

保存實作與精確參數向量

記錄執行檔路徑、版本輸出、作業系統、shell、完整命令與產生的檔名。不要把所有差異都稱為引號錯誤;先證明是哪個 sed 解析參數。

更動前展開 shell 變數與陣列。Linux 命令到達 BSD 系 sed 時,即使畫面相似,token 邊界仍可能不同。

分開 in-place 後綴規則

GNU sed 的 -i 後綴是可選的;沒有後綴就不留備份,有後綴則將原檔重新命名。短選項組合會改變意義,-Ei 與 -iE 並不相同。

FreeBSD 手冊要求 -i 後面有 extension;空值不留備份,非空值決定備份檔名。請把 extension 當成可驗證資料。

修改前預覽轉換結果

先在副本上移除 -i,將 stdout 寫入新的暫存檔。比較內容、行數、編碼並確認預期 pattern 有匹配。

這會分離 sed 程式與替換機制;預覽錯誤時,先修正 regular expression 模式、跳脫、delimiter 或換行。

選擇有邊界的可移植策略

受控環境可以先偵測實作,再使用帶明確備份後綴的已測分支;需要可移植時,驗證暫存輸出後再替換。

不要只依賴另一實作可能拒絕的 sed --version。使用能處理失敗的實作測試、建置系統提供的平台約定或標準暫存檔流程。

以退出證據保障回復

測試無匹配、多重匹配、含空格路徑、結尾換行與既有備份名稱,並核對每個 runner 的結果、exit code 與備份政策。

先小範圍上線。成功代表內容正確、無關位元組穩定,而且只出現預期檔案;失敗時保留輸入與 argv,不要破壞性重試。

zh-TW sed preview and replacement diagram
原創編輯插畫: preview and compare before replacing the source file. Watch at Ease