ログの一部だけを書き換えたいとき、エディタでファイルを開いて手で直すのは地味に面倒です。
sed を覚えてからは、その手間がコマンド一行で片づくようになりました。
とはいえ最初のうちは、s/// の書き方や -i の挙動でつまずきがち。
この記事では置換・抽出・削除という3つの基本操作にしぼって、sed の使いどころを整理します。
sed は「ファイルを開かずに書き換える」道具
sed は stream editor(ストリームエディタ)の略で、入力を1行ずつ受け取って加工し、結果を標準出力へ流していくコマンドです。
ポイントは、元のファイルには手を触れないという点。
画面に出るのは加工後のテキストだけで、-i を付けないかぎり元ファイルは書き換わりません。
だからこそ、まず気軽に実行して結果を眺め、狙いどおりなら本適用する、という試し方ができます。
基本の形はこれだけです。
sed 'コマンド' 対象ファイル
置換:s コマンドがすべての入口
もっとも使うのが置換です。
文字列 apple をすべて orange に置き換えるなら、次のように書きます。
sed 's/apple/orange/g' file.txt
形は s/検索/置換/。
末尾の g は「その行に複数あっても全部」置き換える指定で、付けないと各行の最初の1件だけが対象になります。
検索文字にスラッシュを含むパスなどを扱うときは、区切り文字自体を別の記号に変えられるのです。
sed 's|/usr/local|/opt|g' config.txt
区切りを | にするだけで、バックスラッシュだらけの読みにくい書き方から解放されます。
抽出と削除:-n と p、そして d
特定の行だけ抜き出したいときは、-n で自動出力を止めてから、p で出したい行を指定するのが基本形。
行の削除は d の担当です。
sed -n '2,5p' access.log # 2〜5行目だけ表示
sed -n '/ERROR/p' app.log # ERROR を含む行だけ表示
sed '/^#/d' config.conf # コメント行(#始まり)を削除
sed '1d' data.csv # 先頭行(ヘッダ)を削除
-n と p、そして d を組み合わせるだけで、ログから必要な部分を切り出す作業がぐっと速くなります。
つまずきやすい -i の落とし穴(GNU と BSD)
ファイルを直接書き換えたいときに登場するのが -i(インプレース編集)です。
ここが最大の罠で、Linux(GNU sed) と macOS(BSD sed) で書き方が違います。
Linux では、拡張子を付けるかどうかがバックアップの有無の分かれ目です。
一方 macOS の sed は -i に必ず引数が必要で、バックアップが要らなくても空文字を渡さなければなりません。
# Linux (GNU sed)
sed -i 's/foo/bar/g' file.txt # バックアップ無しで直接書き換え
sed -i.bak 's/foo/bar/g' file.txt # file.txt.bak を残す
# macOS (BSD sed) … -i には必ず引数が要る
sed -i '' 's/foo/bar/g' file.txt # 不要でも空文字 '' を渡す
# 両対応で安全に書くなら
sed -i.bak 's/foo/bar/g' file.txt && rm file.txt.bak
-i は元に戻せないので、まずは -i を付けずに実行し、出力を確認してから付けるのが安全な進め方です。
最後に
置換の s、抽出の -n と p、削除の d。
この3つを押さえるだけで、日々のテキスト整形はずいぶん楽になります。
迷ったら -i を付けずに実行して、結果を見てから本適用する。
この癖をつけておくと、取り返しのつかない事故を避けられます。
以上です。










コメントを残す