【Linux】sedコマンドとは?文字列の置換・削除・抽出などの使い方を解説!

Linuxを使っていると、ファイル内の文字列を置換したり、特定の行だけを削除・表示したりしたい場面があります。

例えば、設定ファイルに書かれているdevelopmentをproductionへ一括で置換したい場合や、特定の文字列を含む行だけを取り除きたい場合です。

このようなときに便利なのが、sedコマンドです。

sedコマンドを使用すると、文字列の置換だけでなく、行の削除・抽出・追加・置き換えなど、さまざまなテキスト処理をコマンドラインから行えます。

この記事では、Linuxのsedコマンドとは何か、基本的な使い方からよく使うオプション、文字列の置換・削除・抽出・追加などについて、初心者向けにわかりやすく解説します。

sedコマンドとは?

sedコマンドとは?

sedコマンドとは、テキストを指定したルールに従って編集し、その結果を出力するためのコマンドです。

sedは「stream editor(ストリームエディター)」の略で、ファイルや標準入力から流れてくるテキストを順番に読み込みながら処理します。

例えば、sample.txtに次の内容が保存されているとします。

Hello Linux
Hello Windows
Hello Ubuntu

Helloを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 grape

appleを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 orange

gは「global」を意味します。gを付けない場合は各行で最初に一致した文字列だけが置換されますが、gを付けると各行で一致したすべての文字列が置換されます。

sedコマンドで処理する行を指定する

sedでは、行番号・行の範囲・文字列などを使って処理対象を指定できます。置換・削除・表示などで共通して利用できます。

指定した行だけ処理する

例えば、sample.txtに次の内容が保存されているとします。

apple
apple
apple

2行目だけappleをorangeへ置換する場合は、次のコマンドを実行します。

sed '2s/apple/orange/' sample.txt

# 実行結果
apple
orange
apple

sの前にある2が処理対象の行番号です。

指定した範囲の行を処理する

例えば、sample.txtに次の内容が保存されているとします。

apple
apple
apple
apple
apple

2行目から4行目までのappleをorangeへ置換する場合は、次のコマンドを実行します。

sed '2,4s/apple/orange/' sample.txt

# 実行結果
apple
orange
orange
orange
apple

2,4のように開始行と終了行をカンマで区切ることで、処理する行の範囲を指定できます。

特定の文字列を含む行だけ処理する

例えば、sample.txtに次の内容が保存されているとします。

app=development
database=development
log=development

databaseを含む行だけ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
grape

3行目を削除する場合は、次のコマンドを実行します。

sed '3d' sample.txt

# 実行結果
apple
banana
grape

3行目のorangeが出力対象から削除されます。

指定した範囲の行を削除する

例えば、sample.txtに次の内容が保存されているとします。

line1
line2
line3
line4
line5

2行目から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 End

DEBUGを含む行を削除する場合は、次のコマンドを実行します。

sed '/DEBUG/d' sample.txt

# 実行結果
INFO Start
INFO Running
INFO End

/DEBUG/に一致した行にdが実行されるため、DEBUGを含む行が出力から取り除かれます。-iを付けていないため、元のファイル自体は変更されません。

sedコマンドで指定した行を表示する

特定の行だけを表示するときは、pコマンドと-nオプションを組み合わせます。

例えば、sample.txtに次の内容が保存されているとします。

apple
banana
orange
grape

3行目だけを表示する場合は、次のコマンドを実行します。

sed -n '3p' sample.txt

# 実行結果
orange

pは「print」を意味します。sedは通常、各行を自動的に出力するため、特定の行だけを表示したい場合は、自動出力を抑制する-nと組み合わせます。

指定した範囲の行を表示する

例えば、sample.txtに次の内容が保存されているとします。

line1
line2
line3
line4
line5

2行目から4行目だけを表示する場合は、次のコマンドを実行します。

sed -n '2,4p' sample.txt

# 実行結果
line2
line3
line4

2,4で指定した範囲だけがpによって表示されます。

特定の文字列を含む行だけ表示する

例えば、sample.txtに次の内容が保存されているとします。

INFO Start
ERROR File not found
INFO Running
ERROR Connection failed

ERRORを含む行だけを表示する場合は、次のコマンドを実行します。

sed -n '/ERROR/p' sample.txt

# 実行結果
ERROR File not found
ERROR Connection failed

/ERROR/に一致した行だけがpによって表示されます。ログからエラー行だけを確認したい場合などに利用できます。

sedコマンドで行を追加・置き換えする

sedでは、指定した行の前後に新しい行を追加したり、行全体を別の内容へ置き換えたりできます。

指定した行の後ろに追加する

例えば、sample.txtに次の内容が保存されているとします。

apple
banana
orange

2行目の後ろにgrapeを追加する場合は、次のコマンドを実行します。

sed '2a grape' sample.txt

# 実行結果
apple
banana
grape
orange

aは「append」を意味し、指定した行の後ろへ新しい行を追加します。

指定した行の前に追加する

例えば、sample.txtに次の内容が保存されているとします。

apple
banana
orange

2行目の前にgrapeを追加する場合は、次のコマンドを実行します。

sed '2i grape' sample.txt

# 実行結果
apple
grape
banana
orange

iは「insert」を意味し、指定した行の前へ新しい行を追加します。

指定した行全体を置き換える

例えば、sample.txtに次の内容が保存されているとします。

apple
banana
orange

2行目全体をmelonへ置き換える場合は、次のコマンドを実行します。

sed '2c melon' sample.txt

# 実行結果
apple
melon
orange

sは一致した文字列を置換するのに対して、cは対象となった行全体を置き換える点が異なります。

別のファイルの内容を挿入する

例えば、sample.txtとadd.txtに次の内容が保存されているとします。

sample.txt
apple
banana
orange

add.txt
grape
melon

sample.txtの2行目の後ろにadd.txtの内容を挿入する場合は、次のコマンドを実行します。

sed '2r add.txt' sample.txt

# 実行結果
apple
banana
grape
melon
orange

rコマンドを使用すると、指定した行の後ろに別のファイルの内容を読み込んで追加できます。

sedコマンドで文字単位に変換する

yコマンドを使用すると、指定した文字を対応する別の文字へ1文字ずつ変換できます。

例えば、sample.txtに次の内容が保存されているとします。

abc123
cab456

aをA、bをB、cをCへ変換する場合は、次のコマンドを実行します。

sed 'y/abc/ABC/' sample.txt

# 実行結果
ABC123
CAB456

sが文字列や正規表現に一致した部分を置換するのに対し、yは指定した文字を1文字ずつ対応する文字へ変換します。

sedコマンドで元のファイルを直接編集する

通常のsedは編集結果を標準出力へ表示するだけで、元のファイルを変更しません。元のファイルを直接変更する場合は、-iオプションを使用します。

例えば、sample.txtに次の内容が保存されているとします。

apple banana
apple orange

appleを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 orange

GNU 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
orange

aから始まる行を削除する場合は、次のコマンドを実行します。

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 apple

appleまたは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/backup

sedのsコマンドでは/以外の文字も区切り文字として使用できます。パスを扱う場合は#などを使うことで、/を何度もエスケープする必要がなくなり、コマンドが読みやすくなります。

sedコマンドで複数の処理を実行する

複数の編集処理を1回のsedで実行する場合は、-eオプションを使用できます。

例えば、sample.txtに次の内容が保存されているとします。

apple banana
banana apple

appleを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/g

command.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 Ubuntu

echoで出力した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を使用すると複数の編集処理を扱える

お読みいただきありがとうございました。

スポンサーリンク