【Linux】sedコマンドでテキストの置換・抽出・編集を自動化する方法

目次

概要

sed(stream editor)は、ファイルを直接開くことなく、パイプやリダイレクトを経由してテキストの内容を動的に編集するためのツールです。文字列の置換、特定行の抽出、行の削除、設定ファイルのコメントアウトといった処理を自動化できるため、シェルスクリプトやシステム構築の自動化において中核的な役割を果たします。

仕様(引数・オプション)

構文

sed [オプション] [コマンド] [ファイル名]

主要なオプション

オプション説明
-n各行の自動出力を抑制します。「p」コマンドと併用して特定の行だけを表示する際に使用します。
-e スクリプト編集コマンド(スクリプト)を明示的に指定します。複数の編集処理を繋げる際にも有効です。
-i[拡張子]ファイルを上書き保存(インプレース編集)します。拡張子を指定すると編集前のバックアップを作成します。
-f ファイル名編集コマンドが記述されたスクリプトファイルを読み込んで実行します。
-r拡張正規表現を使用します(モダンな環境では -E と同等です)。

主要なコマンド

コマンド説明
=現在処理している行番号を表示します。
a\ テキスト現在の行の「後(After)」に指定したテキストを追加します。
i\ テキスト現在の行の「前(Insert)」に指定したテキストを挿入します。
q処理を途中で終了し、直ちに終了します。
r ファイル名指定したファイルの内容を現在の行の後に読み込んで挿入します。
d指定した行、またはパターンに一致する行を削除します。
l 文字数非表示文字を可視化して表示します。引数で折り返し文字数を指定可能です。
p現在の行を標準出力に表示します(通常は -n オプションと併用します)。
s/正規表現/文字列/正規表現に一致する箇所を別の文字列に置換します。

基本の使い方

サーバー上のユーザーリストから、特定範囲の行を抽出して確認する手順です。行番号を付与した状態で、5行目から7行目までを表示します。

BASH

# nlコマンドで行番号を付与し、sedの「p」コマンドで5〜7行目のみを抽出
nl -ba /etc/mori-app/users.list | sed -n '5,7p'

TEXT

     5  mori:x:1001:1001:Admin:/home/mori:/bin/bash
     6  service_user:x:1002:1002::/var/lib/service:/usr/sbin/nologin
     7  test_account:x:1003:1003::/home/test:/bin/sh

実践コマンド

設定ファイルの一括置換や、特定範囲のコメントアウトを行う実用的な例です。ここでは、ホスト名設定ファイルの最初の3行をコメントアウトし、同時にバックアップを作成する操作を想定します。

BASH

# 1行目から3行目の行頭(^)に「# 」を挿入して上書き保存(.bakというバックアップを作成)
sudo sed -i.bak -e "1,3s/^/# /" /etc/mori-app/server_list.conf

# 複数の置換処理を一度に実行し、特定のユーザー名に関連する行だけを確認
sed -e "{s/mori/MORI/g; s/admin/ADMIN/g}" /etc/mori-app/system.log | grep -iE "mori|admin"

TEXT

# server01.internal
# server02.internal
# server03.internal
[2026-01-28] User MORI accessed the ADMIN panel.

カスタムポイント

  • 編集範囲の指定: 1,3s のように行番号で指定する以外に、/PATTERN/s のように特定の文字列を含む行だけを対象にすることも可能です。
  • 否定一致の抽出: 2,10!p のように「!」を使用すると、指定した範囲「以外」を出力対象にできます。
  • 正規表現のエスケープ: / 自体を置換したい場合は、s|/usr/bin|/usr/local/bin|g のように区切り文字を別の記号(| など)に変更すると可読性が高まります。

注意点

  1. -i オプションの破壊性: -i オプションは元のファイルを直接書き換えます。不慣れな操作を行う際は、必ず -i.bak のように拡張子を指定してバックアップを残すか、リダイレクトで別ファイルに出力して内容を確認してください。
  2. macOSとLinuxの違い: -i オプションの挙動(拡張子の指定方法)は、GNU版sed(Linux)とBSD版sed(macOS)で異なるため、スクリプトの移植性には注意が必要です。
  3. アドレス指定の「0」: 0,/pattern/ という指定は一部の古いsedではエラーになります。1行目から開始する場合は 1,/pattern/ を使用するのが確実です。

応用

複雑な編集ルールをテキストファイルに記述し、それを読み込んで大量のログファイルを一括処理する例です。

BASH

# 編集ルールを記述したスクリプトファイル(sed-rules.txt)を作成
cat << 'EOF' > /tmp/sed-rules.txt
# moriユーザーの機密情報をマスクする
s/mori:[^:]*/mori:******** /g
# 冗長な空白を削除
s/  */ /g
EOF

# スクリプトファイルを読み込んでログを処理
sed -n -f /tmp/sed-rules.txt /var/log/mori-app/debug.log | head -n 5

TEXT

[DEBUG] User mori:******** accessed file_storage.
[INFO] Connection established for mori:******** .
[WARN] Multiple attempts from mori:******** noted.

まとめ

sedコマンドは、テキストのストリーム処理において最も柔軟かつ強力なツールの一つであり、コマンドライン上でのクイックな編集から、複雑な一括置換スクリプトまで幅広い用途に対応します。特にインプレース編集による設定ファイルの自動更新や、正規表現を用いた特定パターンの抽出は、手動操作によるミスを減らし運用の再現性を高めるために不可欠です。利用に際しては、正規表現のメタ文字を適切にエスケープすることや、-i オプションによる上書きのリスクを避けるためにバックアップを併用する習慣を身につけることが、安全かつ効率的なシステム管理への近道となります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次