科技 · 實用指南
sed -i 在 Linux 可用、macOS 失敗?修改前先證明參數邊界
辨識 sed 實作與精確 argv,預覽轉換,再選擇明確的備份或暫存檔替換政策。

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,不要破壞性重試。
