Linuxを使っていると、ファイル内の文字列を置換したり、特定の行だけを削除・表示したりしたい場面があります。
例えば、設定ファイルに書かれているdevelopmentをproductionへ一括で置換したい場合や、特定の文字列を含む行だけを取り除きたい場合です。
このようなときに便利なのが、sedコマンドです。
sedコマンドを使用すると、文字列の置換だけでなく、行の削除・抽出・追加・置き換えなど、さまざまなテキスト処理をコマンドラインから行えます。
この記事では、Linuxのsedコマンドとは何か、基本的な使い方からよく使うオプション、文字列の置換・削除・抽出・追加などについて、初心者向けにわかりやすく解説します。
sedコマンドとは?

sedコマンドとは、テキストを指定したルールに従って編集し、その結果を出力するためのコマンドです。
sedは「stream editor(ストリームエディター)」の略で、ファイルや標準入力から流れてくるテキストを順番に読み込みながら処理します。
例えば、sample.txtに次の内容が保存されているとします。
Hello Linux
Hello Windows
Hello UbuntuHelloをHiへ置換する場合は、次のコマンドを実行します。
sed 's/Hello/Hi/' sample.txt
# 実行結果
Hi Linux
Hi Windows
Hi Ubuntuこのように、sedを使用するとファイル内の文字列を簡単に置換できます。なお、-iオプションを付けていない場合、元のファイルは変更されず、編集した結果が標準出力に表示されます。
本記事のコマンド例は、主にLinuxで一般的に使用されているGNU sedを前提としています。そのため、macOSなどで使用されているBSD系sedでは、オプションの指定方法や一部のコマンドの書き方が異なる場合があります。実際に使用する際は、ご利用の環境に合わせてsedの仕様を確認してください。
sedコマンドの基本構文
sedコマンドの基本構文は次のとおりです。
sed [オプション] '編集内容' ファイル名編集内容には、置換を表すs、削除を表すd、表示を表すpなどを指定します。ここからは、それぞれの使い方を実行前のデータと実行結果を確認しながら説明します。
sedコマンドで文字列を置換する
sedで文字列を置換するときは、sコマンドを使用します。基本的な書式はs/置換前/置換後/です。sは「substitute(置換する)」を意味します。
例えば、sample.txtに次の内容が保存されているとします。
apple banana
apple orange
apple grapeappleをmelonへ置換する場合は、次のコマンドを実行します。
sed 's/apple/melon/' sample.txt
# 実行結果
melon banana
melon orange
melon grape各行で最初に一致したappleがmelonへ置換されます。
1行に複数ある文字列をすべて置換する
例えば、sample.txtに次の内容が保存されているとします。
apple apple apple
banana apple apple各行にあるappleをすべてorangeへ置換する場合は、末尾にgを付けて次のコマンドを実行します。
sed 's/apple/orange/g' sample.txt
# 実行結果
orange orange orange
banana orange orangegは「global」を意味します。gを付けない場合は各行で最初に一致した文字列だけが置換されますが、gを付けると各行で一致したすべての文字列が置換されます。
sedコマンドで処理する行を指定する
sedでは、行番号・行の範囲・文字列などを使って処理対象を指定できます。置換・削除・表示などで共通して利用できます。
指定した行だけ処理する
例えば、sample.txtに次の内容が保存されているとします。
apple
apple
apple2行目だけappleをorangeへ置換する場合は、次のコマンドを実行します。
sed '2s/apple/orange/' sample.txt
# 実行結果
apple
orange
applesの前にある2が処理対象の行番号です。
指定した範囲の行を処理する
例えば、sample.txtに次の内容が保存されているとします。
apple
apple
apple
apple
apple2行目から4行目までのappleをorangeへ置換する場合は、次のコマンドを実行します。
sed '2,4s/apple/orange/' sample.txt
# 実行結果
apple
orange
orange
orange
apple2,4のように開始行と終了行をカンマで区切ることで、処理する行の範囲を指定できます。
特定の文字列を含む行だけ処理する
例えば、sample.txtに次の内容が保存されているとします。
app=development
database=development
log=developmentdatabaseを含む行だけdevelopmentをproductionへ置換する場合は、次のコマンドを実行します。
sed '/database/s/development/production/' sample.txt
# 実行結果
app=development
database=production
log=development/database/に一致する行だけに、その後ろのs/development/production/が実行されます。
sedコマンドで行を削除する
行を削除するときは、dコマンドを使用します。
指定した1行を削除する
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
orange
grape3行目を削除する場合は、次のコマンドを実行します。
sed '3d' sample.txt
# 実行結果
apple
banana
grape3行目のorangeが出力対象から削除されます。
指定した範囲の行を削除する
例えば、sample.txtに次の内容が保存されているとします。
line1
line2
line3
line4
line52行目から4行目までを削除する場合は、次のコマンドを実行します。
sed '2,4d' sample.txt
# 実行結果
line1
line5指定した範囲の2〜4行目が削除され、1行目と5行目だけが出力されます。
特定の文字列を含む行を削除する
例えば、sample.txtに次の内容が保存されているとします。
INFO Start
DEBUG value=10
INFO Running
DEBUG value=20
INFO EndDEBUGを含む行を削除する場合は、次のコマンドを実行します。
sed '/DEBUG/d' sample.txt
# 実行結果
INFO Start
INFO Running
INFO End/DEBUG/に一致した行にdが実行されるため、DEBUGを含む行が出力から取り除かれます。-iを付けていないため、元のファイル自体は変更されません。
sedコマンドで指定した行を表示する
特定の行だけを表示するときは、pコマンドと-nオプションを組み合わせます。
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
orange
grape3行目だけを表示する場合は、次のコマンドを実行します。
sed -n '3p' sample.txt
# 実行結果
orangepは「print」を意味します。sedは通常、各行を自動的に出力するため、特定の行だけを表示したい場合は、自動出力を抑制する-nと組み合わせます。
指定した範囲の行を表示する
例えば、sample.txtに次の内容が保存されているとします。
line1
line2
line3
line4
line52行目から4行目だけを表示する場合は、次のコマンドを実行します。
sed -n '2,4p' sample.txt
# 実行結果
line2
line3
line42,4で指定した範囲だけがpによって表示されます。
特定の文字列を含む行だけ表示する
例えば、sample.txtに次の内容が保存されているとします。
INFO Start
ERROR File not found
INFO Running
ERROR Connection failedERRORを含む行だけを表示する場合は、次のコマンドを実行します。
sed -n '/ERROR/p' sample.txt
# 実行結果
ERROR File not found
ERROR Connection failed/ERROR/に一致した行だけがpによって表示されます。ログからエラー行だけを確認したい場合などに利用できます。
sedコマンドで行を追加・置き換えする
sedでは、指定した行の前後に新しい行を追加したり、行全体を別の内容へ置き換えたりできます。
指定した行の後ろに追加する
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
orange2行目の後ろにgrapeを追加する場合は、次のコマンドを実行します。
sed '2a grape' sample.txt
# 実行結果
apple
banana
grape
orangeaは「append」を意味し、指定した行の後ろへ新しい行を追加します。
指定した行の前に追加する
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
orange2行目の前にgrapeを追加する場合は、次のコマンドを実行します。
sed '2i grape' sample.txt
# 実行結果
apple
grape
banana
orangeiは「insert」を意味し、指定した行の前へ新しい行を追加します。
指定した行全体を置き換える
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
orange2行目全体をmelonへ置き換える場合は、次のコマンドを実行します。
sed '2c melon' sample.txt
# 実行結果
apple
melon
orangesは一致した文字列を置換するのに対して、cは対象となった行全体を置き換える点が異なります。
別のファイルの内容を挿入する
例えば、sample.txtとadd.txtに次の内容が保存されているとします。
sample.txt
apple
banana
orange
add.txt
grape
melonsample.txtの2行目の後ろにadd.txtの内容を挿入する場合は、次のコマンドを実行します。
sed '2r add.txt' sample.txt
# 実行結果
apple
banana
grape
melon
orangerコマンドを使用すると、指定した行の後ろに別のファイルの内容を読み込んで追加できます。
sedコマンドで文字単位に変換する
yコマンドを使用すると、指定した文字を対応する別の文字へ1文字ずつ変換できます。
例えば、sample.txtに次の内容が保存されているとします。
abc123
cab456aをA、bをB、cをCへ変換する場合は、次のコマンドを実行します。
sed 'y/abc/ABC/' sample.txt
# 実行結果
ABC123
CAB456sが文字列や正規表現に一致した部分を置換するのに対し、yは指定した文字を1文字ずつ対応する文字へ変換します。
sedコマンドで元のファイルを直接編集する
通常のsedは編集結果を標準出力へ表示するだけで、元のファイルを変更しません。元のファイルを直接変更する場合は、-iオプションを使用します。
例えば、sample.txtに次の内容が保存されているとします。
apple banana
apple orangeappleをmelonへ置換し、sample.txt自体を更新する場合は、次のコマンドを実行します。
sed -i 's/apple/melon/g' sample.txt
cat sample.txt
# 実行結果
melon banana
melon orange通常のsedでは編集結果が標準出力に表示され、元のファイルは変更されません。一方、-iオプションを付けると、編集結果が元のファイルに書き込まれます。
上の例では、sed -iによってsample.txtが変更され、その後にcat sample.txtを実行して編集後の内容を確認しています。
-iを使用すると元のファイルそのものが変更されるため、重要なファイルを編集するときは注意してください。
バックアップを作成してから編集する
例えば、sample.txtに次の内容が保存されているとします。
apple banana
apple orangeGNU sedでバックアップを作成してからappleをmelonへ置換する場合は、次のコマンドを実行します。
sed -i.bak 's/apple/melon/g' sample.txt
cat sample.txt
cat sample.txt.bak
# 実行結果
melon banana
melon orange
apple banana
apple orange編集後の内容はsample.txtに保存され、編集前の内容はsample.txt.bakに残ります。
なお、-i.bakという独立したオプションがあるわけではありません。GNU sedの-iオプションでは、-i[SUFFIX]のようにバックアップファイルに付けるサフィックス(接尾辞)を指定できます。
今回の-i.bakでは、.bakがサフィックスにあたります。そのため、元のファイル名がsample.txtの場合、編集前の内容がsample.txt.bakという名前でバックアップされます。
-i.bak
^^^^
バックアップファイルに付けるサフィックスつまり、-i.bakは「元のファイルを直接編集し、編集前のファイルを.bak付きの名前でバックアップする」という指定です。
sedコマンドで正規表現を使用する
sedでは、正規表現を利用して柔軟に処理対象を指定できます。
例えば、sample.txtに次の内容が保存されているとします。
apple
banana
avocado
orangeaから始まる行を削除する場合は、次のコマンドを実行します。
sed '/^a/d' sample.txt
# 実行結果
banana
orange正規表現の^は行頭を表すため、appleとavocadoの行が削除されます。
また、例えばsample.txtに次の内容が保存されているとします。
sample.txt
image.png
memo.txt
photo.jpgファイル拡張子.txtで終わる行だけを表示する場合は、次のコマンドを実行します。
sed -n '/\.txt$/p' sample.txt
# 実行結果
sample.txt
memo.txt正規表現の$は行末を表し、\.は通常の.という文字を表すため、.txtで終わる行だけが表示されます。
-Eオプションで拡張正規表現を使用する
-Eオプションを使用すると、拡張正規表現(ERE:Extended Regular Expression)を利用できます。
例えば、sample.txtに次の内容が保存されているとします。
apple orange
banana appleappleまたはorangeをfruitへ置換する場合は、次のコマンドを実行します。
sed -E 's/apple|orange/fruit/g' sample.txt
# 実行結果
fruit fruit
banana fruit|によって「appleまたはorange」を表しています。sedでは-Eを付けなくても基本正規表現(BRE:Basic Regular Expression)を使用でき、-Eは拡張正規表現を使用するためのオプションです。
「/」を含む文字列を置換する
sコマンドでは一般的に/を区切り文字として使用するため、パスやURLのように/を多く含む文字列では読みにくくなることがあります。
例えば、sample.txtに次の内容が保存されているとします。
document_root=/home/user
backup_root=/home/user/backup/home/userを/var/wwwへ置換する場合は、区切り文字に#を使用して次のコマンドを実行できます。
sed 's#/home/user#/var/www#g' sample.txt
# 実行結果
document_root=/var/www
backup_root=/var/www/backupsedのsコマンドでは/以外の文字も区切り文字として使用できます。パスを扱う場合は#などを使うことで、/を何度もエスケープする必要がなくなり、コマンドが読みやすくなります。
sedコマンドで複数の処理を実行する
複数の編集処理を1回のsedで実行する場合は、-eオプションを使用できます。
例えば、sample.txtに次の内容が保存されているとします。
apple banana
banana appleappleをorangeへ置換し、さらにbananaをmelonへ置換する場合は、次のコマンドを実行します。
sed -e 's/apple/orange/g' -e 's/banana/melon/g' sample.txt
# 実行結果
orange melon
melon orange-eを複数指定することで、複数の編集処理を順番に実行できます。簡単な処理であれば、sed 's/apple/orange/g; s/banana/melon/g' sample.txtのようにセミコロンで区切ることもできます。
sedの編集処理をファイルに記述する
編集処理が多くなる場合は、処理内容を別のファイルへ記述し、-fオプションで読み込むこともできます。
例えば、sample.txtとcommand.sedに次の内容が保存されているとします。
sample.txt
apple banana
banana apple
command.sed
s/apple/orange/g
s/banana/melon/gcommand.sedに記述した2つの置換処理をsample.txtへ適用する場合は、次のコマンドを実行します。
sed -f command.sed sample.txt
# 実行結果
orange melon
melon orange処理内容が長くなる場合や、同じ編集処理を何度も使用する場合に便利です。なお、sedスクリプト用ファイルに.sedという拡張子を付けることはありますが、必須ではありません。
他のコマンドの実行結果をsedへ渡す
sedはファイルだけでなく、標準入力から受け取ったテキストも処理できます。
例えば、echoコマンドでHello Linuxを出力し、その文字列をパイプ(|)でsedへ渡してLinuxをUbuntuへ置換する場合は、次のコマンドを実行します。
echo "Hello Linux" | sed 's/Linux/Ubuntu/'
# 実行結果
Hello Ubuntuechoで出力したHello Linuxがsedへ渡され、LinuxがUbuntuへ置換されます。
sedコマンドのよく使うオプション
sedでよく使用するオプションは次のとおりです。
| オプション | 説明 |
-n | 通常行われる自動出力を行わない |
-i | 元のファイルを直接編集する |
-i.bak | バックアップを作成して元のファイルを編集する |
-e | 編集処理を指定する。複数指定できる |
-f | ファイルに記述したsedスクリプトを読み込む |
-E | 拡張正規表現を使用する |
sedコマンドでよく使う編集コマンド
sedでよく使用する編集コマンドをまとめると、次のようになります。
| コマンド | 説明 |
s | 文字列を置換する |
d | 行を削除する |
p | 行を表示する |
a | 対象行の後ろへ行を追加する |
i | 対象行の前へ行を追加する |
c | 対象行全体を置き換える |
r | ファイルの内容を読み込んで追加する |
y | 文字を1文字ずつ別の文字へ変換する |
まずは、使用頻度の高いs、d、pの3つを覚えておくとよいでしょう。
sedコマンドの使用例まとめ
よく使用する処理とコマンドをまとめると、次のようになります。
| やりたいこと | コマンド |
| 文字列を置換する | sed 's/apple/orange/' sample.txt |
| 1行内のすべてを置換する | sed 's/apple/orange/g' sample.txt |
| 3行目を削除する | sed '3d' sample.txt |
| 2〜4行目を削除する | sed '2,4d' sample.txt |
| ERRORを含む行を削除する | sed '/ERROR/d' sample.txt |
| 3行目だけ表示する | sed -n '3p' sample.txt |
| ERRORを含む行だけ表示する | sed -n '/ERROR/p' sample.txt |
| 2行目の後ろへ追加する | sed '2a text' sample.txt |
| 2行目の前へ追加する | sed '2i text' sample.txt |
| 2行目全体を置き換える | sed '2c text' sample.txt |
| ファイルを直接編集する | sed -i 's/apple/orange/g' sample.txt |
| 複数の処理を実行する | sed -e '処理1' -e '処理2' sample.txt |
| sedスクリプトを読み込む | sed -f command.sed sample.txt |
| 拡張正規表現を使用する | sed -E '編集内容' sample.txt |
本記事のまとめ
この記事では「sedコマンド」について、以下の内容を説明しました。
sedはテキストを指定したルールに従って編集し、その結果を出力するコマンドsで置換、dで削除、pで表示できる- 行番号・範囲・文字列・正規表現を使って処理対象を指定できる
-iを使用すると元のファイルを直接編集できる-eや-fを使用すると複数の編集処理を扱える
お読みいただきありがとうございました。