🐧 Linux 総合学習プラットフォーム

sed -i の一括置換を試運転せずに実行して、原本を壊してしまった

症状(よく出るエラー)

sed -i 's/old/new/g' *.conf を実行した後で、置換パターンが広く当たりすぎていたことに気づく。関係ない行の old を含む単語まで書き換わり、元に戻す手段がない。

原因

sed -i(in-place)はファイルを直接書き換えるモードで、実行した瞬間に元の内容は失われる。正規表現は思ったより広くマッチしがちで、たとえば s/path/route/g は filepath の中の path にも当たる。「プレビューなし・確認なし・即上書き」という3拍子が揃っているため、パターンの検証を省くとそのまま事故になる。

直し方

まず -i を外して sed 's/old/new/g' file.conf | diff file.conf - のように差分で当たり具合を確認し、単語境界が要るなら s/\bold\b/new/g に直す。本番実行は sed -i.bak 's/old/new/g' *.conf とバックアップ拡張子付きで行えば、失敗しても for f in *.bak; do mv "$f" "${f%.bak}"; done で戻せる。git 管理下なら実行前にコミットしておくのが一番簡単な保険。

▶ 学習アプリでしっかり学ぶ