sed入門|テキストを置換・抽出・削除する基本

sed入門|テキストを置換・抽出・削除する基本

ログの一部だけを書き換えたいとき、エディタでファイルを開いて手で直すのは地味に面倒です。

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             # 先頭行(ヘッダ)を削除

-np、そして 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、抽出の -np、削除の d

この3つを押さえるだけで、日々のテキスト整形はずいぶん楽になります。

迷ったら -i を付けずに実行して、結果を見てから本適用する。

この癖をつけておくと、取り返しのつかない事故を避けられます。

jq入門|JSONをコマンドラインで整形・抽出する基本

以上です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA