テキスト加工 sed

テキスト加工 sed とは

sedコマンドを使って、テキストファイルの内容を自在に加工するテクニックを習得します。本レッスンでは、テキスト加工 sed の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

なぜ重要か

sedStream Editor の略で、その名の通り「流れてくるテキストを編集する」コマンドです。grep が抽出に特化しているのに対し、sed は「置換」「削除」「挿入」といった編集操作を、行単位で行えます。設定ファイルの一括書き換え、ログの整形、生成されたテキストの加工など、用途は多岐にわたります。

ファイルを直接書き換える方法 (-i) も用意されていますが、まずは標準入出力ベースで扱い方を覚えるのが安全です。

基本構文

ターミナル

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

最もよく使うのは置換 (s コマンド) です。

ターミナル

sed 's/old/new/'

s/古い/新しい/ で 1 行に対し最初の 1 箇所だけ置換します。g を付けると全箇所、I を付けると大文字小文字を無視します。

主要オプション

オプション役割
-n自動表示を抑制 (明示的に出すときだけ表示)
-iファイルを直接編集 (BSD 系は -i '' が必要)
-E拡張正規表現を有効化
-e複数のスクリプトを指定

動作の図解

diagram (will load when visible)

各行を順番に読み込み、スクリプトを適用してから次の行へ進みます。

置換の例

ターミナル

$ echo "hello world" | sed 's/world/Linux/' hello Linux

複数箇所を一気に変えたいときは g を付けます。

ターミナル

$ echo "aaa bbb aaa" | sed 's/aaa/X/g' X bbb X

大文字小文字を無視する I も便利です。

ターミナル

$ echo "Apple apple APPLE" | sed 's/apple/banana/gI' banana banana banana

行の削除 (d)

ターミナル

$ echo -e "a\nb\nc" | sed '/b/d' a c

/パターン/d で、パターンに一致する行を削除できます。空行を消すなら /^$/d、コメント行を消すなら /^#/d といった具合です。

行番号指定

sed は行番号でも操作できます。

ターミナル

$ echo -e "a\nb\nc\nd" | sed -n '2,3p' b c

-n で自動出力を止め、2,3p で 2 行目から 3 行目だけを表示しています。

-i でファイルを直接書き換えるときは、必ず先にバックアップを取るか、-i.bak のようにバックアップ拡張子を指定しましょう。一度書き換えると元には戻りません。

拡張正規表現 (-E)

ターミナル

$ echo "user42 order100" | sed -E 's/[0-9]+/N/g' userN orderN

-E を付けると +? がそのまま使えます。BRE のままだと \+ のようにエスケープが必要です。

後方参照

\1\2 … でグループにマッチした内容を再利用できます。

ターミナル

$ echo "John Doe" | sed -E 's/(\w+) (\w+)/\2 \1/' Doe John

ファーストネームとラストネームを入れ替える例です。実務では「タグの中身を抜き出して別の形に組み直す」用途で多用します。

sed のスクリプトはシングルクォートで囲むのが原則です。ダブルクォートだと $\ の解釈が変わってしまい、意図しない結果になることがあります。

やってみよう

演習では echo で文字列を作り、sed で置換を試します。g フラグの有無で結果がどう変わるかを比べてみてください。

区切り文字を変える

s コマンドの区切りは / 以外も使えます。パスのように / を多く含む文字列を扱うときは別の区切りに変えると読みやすくなります。

ターミナル

$ echo "/usr/local/bin" | sed 's|/usr/local|/opt|' /opt/bin

|# がよく使われます。シェルで特別な意味を持たない記号を選ぶのがコツです。

複数の処理をまとめて適用

-e を使えば複数のスクリプトを順に適用できます。スクリプトをセミコロンで区切る書き方も同様です。

ターミナル

$ echo "hello world" | sed -e 's/hello/HI/' -e 's/world/EARTH/' HI EARTH

行範囲とパターン範囲

行番号やパターンで対象範囲を絞れます。

ターミナル

$ echo -e "a\nb\nc\nd" | sed '2,3 s/.*/X/' a X X d

/開始/,/終了/ のようにパターンで範囲を指定することもでき、ログから特定の区間だけ抜き出す用途で重宝します。

まとめ

  • sed 's/old/new/' が最も基本の置換
  • g で全箇所、I で大小無視、-E で拡張正規表現
  • d で行削除、p-n で特定行のみ表示
  • 区切り文字を変えると、パスを含む置換が読みやすい
  • -i での直接編集は強力だが、バックアップを忘れずに

次のレッスン

次は 列処理 awk で、sedコマンドを使って、テキストファイルの内容を自在に加工するテクニックを習得します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. sed の基本 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. sed の基本 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

課題

  1. echo で文字列を出力
  2. sed の s コマンドで置換
  3. g フラグで全置換

ヒント

script.sh
script.sh
学習モード
script.sh
ターミナル出力