メインコンテンツへスキップ
中級9分で読める

sedで文字列置換を極める

Linuxのsedコマンドを使って、ストリームエディタとしてテキストの置換、削除、挿入などを効率的に行う方法を実例を交えて詳しく解説します。

実践編sed文字列置換テキスト処理正規表現

🎯 この記事で学べること

  • 1
    `sed`コマンドの基本的な使い方と文字列置換の方法をマスターできます
  • 2
    正規表現を使った高度なパターンマッチングと置換ができるようになります
  • 3
    行の削除、挿入、範囲指定などの編集操作を身につけられます
  • 4
    ファイルの直接編集やバックアップの作成方法を学べます
  • 5
    実践的なログ処理や設定ファイル編集のテクニックが使えるようになります

読了時間: 約9

文字列を自在に置き換える魔法のツール!

こんにちは!今回は、テキスト処理の強力な味方sedコマンドについて学んでいきましょう。

「ファイル内の特定の文字列を全部置き換えたい」「ログファイルから不要な情報を削除したい」そんな時、一つ一つ手で編集していませんか?sedを使えば、そんな作業を一瞬で終わらせられるんです!

sedは「Stream Editor」の略で、ファイルを開かずにテキストを編集できるコマンドです。パイプラインで他のコマンドと組み合わせられるので、スクリプトや自動化にも最適ですよ!

基本的な使い方

まずは基本構文を覚えよう

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

この構文がすべての基本です。覆えておけば、あとは応用できますよ!

一番シンプルな文字列置換

sedの最も基本的な使い方は、文字列の置換です。これだけでもとても便利ですよ!

$ sed 's/old/new/' file.txt

このsは「substitute(置換)」の頭文字です。「old」を「new」に置き換えるという意味ですね。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

注意!このままだと、各行の最初に見つかった「old」だけが置換されます。全部置き換えたい場合は、この後で紹介するgフラグを使いましょう!

もっと貪侪に置換したい!

全部置き換えるには(gフラグ)

「1つ目だけじゃなくて、全部置き換えたい!」そんな時はg(global)フラグを使いましょう:

$ sed 's/old/new/g' file.txt

「/g」を付けるだけで、行内のすべてのマッチが置換されます。これはよく使うので、しっかり覚えておきましょうね!

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

大文字小文字を気にしない(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とすれば、大文字小文字を無視して全部置換できます。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

🎮 理解度チェック

Q1: sed 's/apple/orange/g'のgフラグの役割は何ですか?

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などを付けてバックアップを作りましょう。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

正規表現でもっとパワフルに!

正規表現を使った高度なパターン

sedの真の力は、正規表現を使った時に発揮されます。ちょっと難しく感じるかもしれませんが、一度覚えるととても便利ですよ!

# 数字を括弧で囲む(&はマッチした全体を表す)
$ sed 's/[0-9]\+/(&)/g' file.txt

# 行頭の空白を削除(整形に便利!)
$ sed 's/^[[:space:]]*//' file.txt

# 行末の空白を削除
$ sed 's/[[:space:]]*$//' file.txt

[0-9]\+は「1文字以上の数字」、^は「行頭」、$は「行末」を表します。これだけでもかなり便利です!

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

キャプチャした部分を再利用(後方参照)

これはちょっと上級テクニックですが、マスターすると魔法のようなことができます!

# 名前と姓を入れ替える
$ sed 's/\([^ ]*\) \([^ ]*\)/\2, \1/' names.txt
# John Smith → Smith, John

# HTMLタグの内容を抽出
$ sed 's/<\([^>]*\)>\(.*\)<\/\1>/\2/' html.txt
# <b>important</b> → important

\( \)で囲んだ部分が\1\2\3...として使えます。これを使えば、テキストの並び替えや抽出が自由自在!

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

🎮 理解度チェック

Q2: sed -i.bak 's/old/new/g' file.txt.bakの役割は?

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ならパターンにマッチする行を削除です。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

行を追加する(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

範囲指定はログファイルの特定部分だけを処理したい時にとても便利です!

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

実践的な使い方を見てみよう!

設定ファイルの編集

設定ファイルを編集する時、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オプションを使えば、複数の編集コマンドを一度に実行できます。効率的ですね!

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ログファイルの処理

ログファイルの整形や匿名化にも大活躍します:

# 日付形式を変更(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
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

🎮 理解度チェック

Q3: sed '/^$/d' file.txtは何をしますか?

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!|#@など、パターンに含まれない文字なら何でも使えます。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

よく使う便利なワンライナー

空白の整理

テキストファイルをきれいに整形するのに便利なコマンドです:

# 連続する空行を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コマンドで、さらに高度なテキスト処理を学びましょう。sedawkを組み合わせれば、テキスト処理の鬼になれます!

YouTube動画で復習

動画でさらに詳しく学びたい方は、CommandAcademyのYouTubeチャンネルをチェック!視覚的にコマンドの動作を確認できます。

sedをマスターするコツは「実際に使ってみる」こと。まずはテストファイルで練習してから、実際のファイルに挑戦しましょう!