🎯 この記事で学べること
- 1`sed`コマンドの基本的な使い方と文字列置換の方法をマスターできます
- 2正規表現を使った高度なパターンマッチングと置換ができるようになります
- 3行の削除、挿入、範囲指定などの編集操作を身につけられます
- 4ファイルの直接編集やバックアップの作成方法を学べます
- 5実践的なログ処理や設定ファイル編集のテクニックが使えるようになります
読了時間: 約9分
文字列を自在に置き換える魔法のツール!
こんにちは!今回は、テキスト処理の強力な味方sed
コマンドについて学んでいきましょう。
「ファイル内の特定の文字列を全部置き換えたい」「ログファイルから不要な情報を削除したい」そんな時、一つ一つ手で編集していませんか?sed
を使えば、そんな作業を一瞬で終わらせられるんです!
sed
は「Stream Editor」の略で、ファイルを開かずにテキストを編集できるコマンドです。パイプラインで他のコマンドと組み合わせられるので、スクリプトや自動化にも最適ですよ!
基本的な使い方
まずは基本構文を覚えよう
sed [オプション] 'コマンド' [ファイル...]
この構文がすべての基本です。覆えておけば、あとは応用できますよ!
一番シンプルな文字列置換
sed
の最も基本的な使い方は、文字列の置換です。これだけでもとても便利ですよ!
$ sed 's/old/new/' file.txt
このs
は「substitute(置換)」の頭文字です。「old」を「new」に置き換えるという意味ですね。
ファイルツリー
注意!このままだと、各行の最初に見つかった「old」だけが置換されます。全部置き換えたい場合は、この後で紹介するg
フラグを使いましょう!
もっと貪侪に置換したい!
全部置き換えるには(gフラグ)
「1つ目だけじゃなくて、全部置き換えたい!」そんな時はg
(global)フラグを使いましょう:
$ sed 's/old/new/g' file.txt
「/g」を付けるだけで、行内のすべてのマッチが置換されます。これはよく使うので、しっかり覚えておきましょうね!
ファイルツリー
大文字小文字を気にしない(iフラグ)
「Apple」も「apple」も「APPLE」も全部同じに扱いたい時はi
(ignore case)フラグを使います:
$ sed 's/pattern/replacement/i' file.txt
n番目だけ置き換えたい!
「2番目のマッチだけ置き換えたい」という細かい制御もできます:
# 2番目のマッチのみ置換
$ sed 's/pattern/replacement/2' file.txt
組み合わせもできますよ!例えば/gi
とすれば、大文字小文字を無視して全部置換できます。
ファイルツリー
🎮 理解度チェック
Q1: sed 's/apple/orange/g'
のgフラグの役割は何ですか?
ファイルを直接書き換える!
-iオプションでその場編集
これまでの例では、結果が画面に表示されるだけで、元のファイルは変更されませんでした。実際にファイルを書き換えたい時は-i
オプションを使います:
# バックアップなしで直接編集(危険!)
$ sed -i 's/old/new/g' file.txt
# バックアップを作成して編集(安全!)
$ sed -i.bak 's/old/new/g' file.txt
-i
オプションは元のファイルを上書きします!必ず.bak
などを付けてバックアップを作りましょう。
ファイルツリー
正規表現でもっとパワフルに!
正規表現を使った高度なパターン
sed
の真の力は、正規表現を使った時に発揮されます。ちょっと難しく感じるかもしれませんが、一度覚えるととても便利ですよ!
# 数字を括弧で囲む(&はマッチした全体を表す)
$ sed 's/[0-9]\+/(&)/g' file.txt
# 行頭の空白を削除(整形に便利!)
$ sed 's/^[[:space:]]*//' file.txt
# 行末の空白を削除
$ sed 's/[[:space:]]*$//' file.txt
[0-9]\+
は「1文字以上の数字」、^
は「行頭」、$
は「行末」を表します。これだけでもかなり便利です!
ファイルツリー
キャプチャした部分を再利用(後方参照)
これはちょっと上級テクニックですが、マスターすると魔法のようなことができます!
# 名前と姓を入れ替える
$ sed 's/\([^ ]*\) \([^ ]*\)/\2, \1/' names.txt
# John Smith → Smith, John
# HTMLタグの内容を抽出
$ sed 's/<\([^>]*\)>\(.*\)<\/\1>/\2/' html.txt
# <b>important</b> → important
\( \)
で囲んだ部分が\1
、\2
、\3
...として使えます。これを使えば、テキストの並び替えや抽出が自由自在!
ファイルツリー
🎮 理解度チェック
Q2: sed -i.bak 's/old/new/g' file.txt
で.bak
の役割は?
行単位の編集もお手の物!
不要な行を削除する(dコマンド)
sed
は文字列置換だけじゃありません。行全体を削除することもできるんです!
# 3行目を削除
$ sed '3d' file.txt
# 空行を全部削除(よく使います!)
$ sed '/^$/d' file.txt
# ERRORを含む行を削除
$ sed '/ERROR/d' file.txt
d
は「delete」の頭文字です。3d
なら3行目を削除、/pattern/d
ならパターンにマッチする行を削除です。
ファイルツリー
行を追加する(iコマンドとaコマンド)
削除できるなら、もちろん追加もできます!
# 3行目の前に挿入(i = insert)
$ sed '3i\New line' file.txt
# パターンの後に追加(a = append)
$ sed '/pattern/a\Added line' file.txt
範囲を指定してまとめて処理
「5行目から10行目まで」「STARTからENDまで」のように、範囲を指定して処理できます:
# 5行目から10行目までの範囲で置換
$ sed '5,10s/old/new/g' file.txt
# STARTからENDまでの間を処理
$ sed '/START/,/END/s/old/new/g' file.txt
範囲指定はログファイルの特定部分だけを処理したい時にとても便利です!
ファイルツリー
実践的な使い方を見てみよう!
設定ファイルの編集
設定ファイルを編集する時、sed
はとても役立ちます:
# コメント行を除外して実際の設定だけを見る
$ sed '/^#/d' config.conf
# ポート番号を変更
$ sed 's/^port=.*/port=8080/' server.conf
# 複数の設定を一度に変更(-eで追加)
$ sed -e 's/localhost/192.168.1.100/g' -e 's/3306/3307/g' db.conf
-e
オプションを使えば、複数の編集コマンドを一度に実行できます。効率的ですね!
ファイルツリー
ログファイルの処理
ログファイルの整形や匿名化にも大活躍します:
# 日付形式を変更(YYYY-MM-DD → DD/MM/YYYY)
$ sed 's/\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\)/\3\/\2\/\1/g' log.txt
# IPアドレスをマスク(プライバシー保護)
$ sed -E 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/xxx.xxx.xxx.xxx/g' access.log
-E
オプションを使うと、拡張正規表現が使えます。{1,3}
のような繰り返しが簡単に書けますよ!
CSVファイルの処理
データ処理にも便利です:
# カンマをタブに変換(Excelで開きやすく)
$ sed 's/,/\t/g' data.csv
# 3番目のカラムを削除(ちょっと難しいけど便利!)
$ sed 's/^\([^,]*,[^,]*,\)[^,]*,/\1/' data.csv
ファイルツリー
🎮 理解度チェック
Q3: sed '/^$/d' file.txt
は何をしますか?
複数行にまたがる処理(上級編)
次の行も一緒に処理(Nコマンド)
「連続する2行をまとめて処理したい」そんな時に使います:
# 2行を1行にまとめる
$ sed 'N;s/\n/ /' file.txt
# 特定のパターンの次の行を編集
$ sed '/pattern/{n;s/old/new/;}' file.txt
一時保存で高度な処理(ホールドスペース)
これはかなり上級者向けですが、sed
には2つの作業領域があります:
- パターンスペース:現在処理中の行
- ホールドスペース:一時保存用
# 行の入れ替えなどの複雑な処理が可能
$ sed -n '1h;2{p;g;p}' file.txt
複数行の処理は難しいので、まずは基本的な置換や削除をマスターしてから挑戦しましょう!
さらに高度なテクニック
条件を組み合わせる
「特定の範囲で、特定のパターンにマッチした時だけ」のような複雑な条件も指定できます:
# 5~10行目で、patternを含む行だけ置換
$ sed '5,10{/pattern/s/old/new/g;}' file.txt
# patternを含まない行だけ処理(!は否定)
$ sed '/pattern/!s/old/new/g' file.txt
シェル変数を使った動的な処理
スクリプトで使う時は、変数を使えると便利です:
# シェル変数を使用(ダブルクォートに注意!)
OLD="apple"
NEW="orange"
sed "s/$OLD/$NEW/g" file.txt
# パスに/が含まれる場合は区切り文字を変更
sed 's|/path/to/old|/path/to/new|g' file.txt
区切り文字は/
でなくてもOK!|
や#
、@
など、パターンに含まれない文字なら何でも使えます。
ファイルツリー
よく使う便利なワンライナー
空白の整理
テキストファイルをきれいに整形するのに便利なコマンドです:
# 連続する空行を1行にまとめる
$ sed '/^$/N;/\n$/d' file.txt
# 各行の前後の空白を削除(trim処理)
$ sed 's/^[[:space:]]*//;s/[[:space:]]*$//' file.txt
行番号を付ける
コードやログを見やすくしたい時に:
# シンプルな行番号付け
$ sed = file.txt | sed 'N;s/\n/\t/'
# 空行を除いて番号付け
$ sed '/./=' file.txt | sed '/./N;s/\n/ /'
HTMLの処理
Webページの処理にも使えます:
# HTMLタグを全部削除(テキストのみ抽出)
$ sed 's/<[^>]*>//g' html.txt
# titleタグの中身を抽出
$ sed -n 's/.*<title>\(.*\)<\/title>.*/\1/p' index.html
これらのワンライナーは、そのままコピーして使えるので、メモしておくと便利ですよ!
デバッグとトラブルシューティング
必要な行だけ表示(-nオプション)
通常、sed
はすべての行を出力しますが、-n
オプションを使うと必要な行だけ表示できます:
# パターンにマッチした行だけ表示
$ sed -n '/ERROR/p' log.txt
# 置換が成功した行だけ表示
$ sed -n 's/old/new/p' file.txt
デバッグのコツ
うまくいかない時は、段階的に確認しましょう:
# 文字を可視化して表示(タブや空白が見える)
$ sed -n 'l' file.txt
# 複数のコマンドを順番に実行して確認
$ sed -e 's/step1/STEP1/' -e 's/step2/STEP2/' file.txt
複雑なsed
コマンドを書く時は、一つずつ動作を確認しながら作るとミスが減りますよ!
大きなファイルでも高速に処理
巨大ファイルを貪くしく処理
数GBのログファイルでも、工夫すれば高速に処理できます:
# 必要な部分だけ抽出してから処理
$ sed -n '1000,2000p' largefile.txt | sed 's/old/new/g'
# 1000行目で早期終了(無駄な処理を避ける)
$ sed '1000q' file.txt
パイプを減らして高速化
# 非効率(パイプ3回!)
$ sed 's/a/A/g' file.txt | sed 's/b/B/g' | sed 's/c/C/g'
# 効率的(一度の実行で完了)
$ sed -e 's/a/A/g' -e 's/b/B/g' -e 's/c/C/g' file.txt
パイプを何度も使うと、その度にファイル全体を読み込むので遅くなります。-e
でまとめましょう!
複雑な処理はスクリプトファイルに
「コマンドが長くなりすぎて大変!」そんな時は、スクリプトファイルに書きましょう:
# script.sedというファイルを作成
s/old1/new1/g
s/old2/new2/g
/ERROR/d
/^$/d
# -fオプションで実行
$ sed -f script.sed input.txt
これなら、複雑な処理も管理しやすく、再利用も簡単ですね!
📝 まとめ
今回はsed
コマンドについて学びました!
sed
はストリームエディタで、ファイルを開かずに編集できる- 基本は
s/old/new/
で置換、g
フラグで全部置換 -i
オプションでファイルを直接編集(バックアップ必須!)- 正規表現で柔軟なパターンマッチングが可能
- 行の削除、挿入、範囲指定など多彩な編集ができる
sed
は最初は難しく感じるかもしれませんが、基本のs/old/new/g
から始めて、少しずつ機能を試していけば、すぐに使いこなせるようになります。ログファイルの整形、設定ファイルの一括変更、テキストデータの前処理など、様々な場面で大活躍しますよ!
次はawkコマンドで、さらに高度なテキスト処理を学びましょう。sed
とawk
を組み合わせれば、テキスト処理の鬼になれます!
YouTube動画で復習
動画でさらに詳しく学びたい方は、CommandAcademyのYouTubeチャンネルをチェック!視覚的にコマンドの動作を確認できます。
sed
をマスターするコツは「実際に使ってみる」こと。まずはテストファイルで練習してから、実際のファイルに挑戦しましょう!