sedコマンドによるLinuxテキスト処理の実践ガイド

sedは、入力ファイルを1行ずつ読み込み、各行に対して指定されたスクリプトを適用するストリームエディタです。

基本構文:

sed [オプション]... 'スクリプト' [入力ファイル]...

主なオプション

  • -n:パターンスペースの内容を自動で出力しない
  • -e スクリプト:複数の編集コマンドを指定
  • -f スクリプトファイル:ファイルから編集コマンドを読み込む
  • -r:拡張正規表現を使用可能にする
  • -i[SUFFIX]:元のファイルを直接編集(バックアップが必要ならSUFFIXを指定)

アドレス指定方法

  • なし:全行に適用
  • 行番号(例:5):特定の行のみ対象
  • 正規表現(例:/pattern/):マッチした行すべて
  • 範囲指定:
    • 2,5:2行目から5行目
    • 3,+2:3行目からその次の2行(計3行)
    • /start/,/end/:最初のstartマッチから次のendマッチまで
    • $:最終行
  • ステップ指定(~):
    • 1~2:奇数行
    • 2~2:偶数行

代表的な編集コマンド

  • d:行を削除
  • p:パターンスペースの内容を出力
  • a \テキスト:現在行の後にテキストを追加(\nで改行可)
  • i \テキスト:現在行の前にテキストを挿入
  • c \テキスト:マッチした行全体を置換
  • w ファイル:マッチした行を別ファイルに書き出し
  • r ファイル:指定ファイルの内容を現在行の後に挿入
  • =:マッチ行の行番号を表示
  • !:条件の否定(例:1!d → 1行目以外を削除)
  • s/検索/置換/フラグ:文字列の置換(区切り文字は@#など任意)

置換フラグ

  • g:1行内で全マッチを置換
  • p:置換が成功した行を出力(通常は-nと併用)
  • w ファイル:置換結果をファイルに保存

実践例

例1:GRUB設定ファイルの行頭空白を削除

sed 's@^[[:space:]]\+@@' /etc/grub2.cfg

例2:fstabファイルのコメント行から#と後続の空白を除去

sed 's@^#[[:space:]]*@@' /etc/fstab

例3:絶対パスからディレクトリ部分を抽出(dirname相当)

echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

高度な操作:ホールドスペースの活用

sedにはパターンスペース(現在処理中の行)とホールドスペース(一時保持領域)があります。

  • h:パターンスペース → ホールドスペース(上書き)
  • H:パターンスペース → ホールドスペース(追記)
  • g:ホールドスペース → パターンスペース(上書き)
  • G:ホールドスペース → パターンスペース(追記)
  • x:両スペースの内容を入れ替え
  • n:次の行をパターンスペースに読み込み(現在行は破棄)
  • N:次の行をパターンスペースに追加(改行で連結)
  • D:マルチラインパターンスペースの最初の行を削除し、スクリプトの先頭に戻る

応用例

  • 偶数行を表示:
    sed -n 'n;p' FILE
  • ファイル内容を逆順に出力:
    sed '1!G;h;$!d' FILE
  • 最終行のみ取得:
    sed '$!d' FILE
  • 最後の2行を取得:
    sed '$!N;$!D' FILE
  • 空行を削除し、非空行の後に空行を1つ追加:
    sed '/^$/d;G' FILE
  • 奇数行を表示:
    sed 'n;d' FILE
  • 各行の後に空行を追加:
    sed 'G' FILE

タグ: sed linux テキスト処理 正規表現 ストリームエディタ

7月31日 01:14 投稿