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