Linuxコマンド一覧

sedコマンド|ファイルの中身を置換する

__ __ _ _____
\ \ / /__| |_|_ _|__ _ __ _ __ ___
\ \ /\ / / _ \ '_ \| |/ _ \ '__| '_ ` _ \
\ V V / __/ |_) | | __/ | | | | | |
\_/\_/ \___|_.__/|_|\___|_| |_| |_| |_
 
sed を試すためのサンドボックスです。実機のファイルには影響しません。
user@webterm:~/project$
 

sed はファイルを開かずに文字列を置換するコマンドです。`s/前/後/` の書き方、`-i` でファイルそのものを書き換える方法、行を選んで消す書き方を、ブラウザ上のターミナルで打ちながら確認できます。

最終更新: 2026-09-06

書式

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

いちばん使うスクリプトは s/前/後/(置換)です。

まず打ってみる

置換の対象を見ておきます。

$ cat config.yml
port: 3000
host: localhost
debug: false

localhost を置き換えます。

$ sed 's/localhost/example.com/' config.yml
port: 3000
host: example.com
debug: false

置き換わった結果が出ました。 ただし、ファイルはまだ変わっていません。

$ cat config.yml
port: 3000
host: localhost
debug: false

sed は既定では画面に出すだけです。 この性質のおかげで、本番の設定ファイルでも安心して結果を先に確かめられます。

ファイルそのものを書き換える

確かめてから -i を付けます。

$ sed -i 's/localhost/example.com/' config.yml
$ cat config.yml
port: 3000
host: example.com
debug: false

-i は in-place(その場で)の意味です。 書き換える前の中身を残したいときは、-i に接尾辞を付けます。

$ sed -i.bak 's/3000/8080/' config.yml
$ ls
config.yml  config.yml.bak  logs/  urls.txt
$ cat config.yml.bak
port: 3000
host: example.com
debug: false

config.yml.bak が控えです。 サーバーの設定を触るときは、これを付ける癖にしておくと戻せます。

1行に2か所あるとき

既定では、各行の最初の1か所だけが置き換わります。

$ cat urls.txt
api=http://example.com cdn=http://cdn.example.com
$ sed 's/http:/https:/' urls.txt
api=https://example.com cdn=http://cdn.example.com

2つ目が残りました。 全部を置き換えるには末尾に g を足します。

$ sed 's/http:/https:/g' urls.txt
api=https://example.com cdn=https://cdn.example.com

g は global の頭文字です。

行を選ぶ・消す

置換のほかに、行を選ぶ書き方があります。

$ sed '/DEBUG/d' logs/app.log
INFO  server started
ERROR connection refused
INFO  retrying
ERROR timeout

/DEBUG/d は「DEBUG を含む行を消す」です。 逆に、行番号で選ぶこともできます。

$ sed -n '2p' logs/app.log
DEBUG cache warmed
$ sed -n '1,3p' logs/app.log
INFO  server started
DEBUG cache warmed
ERROR connection refused

-n で既定の出力を止め、p で出したい行だけを指定しています。

実務での使いどころ

sed は、同じ直し方を機械的に繰り返すときに打つコマンドです。

場面打ち方
設定ファイルの値を差し替えるsed -i.bak 's/3000/8080/' config.yml
URL をまとめて https にするsed -i 's/http:/https:/g' urls.txt
特定の行を落として読むsed '/DEBUG/d' app.log
行番号を指定して抜き出すsed -n '10,20p' app.log
各行の先頭に印を付けるsed 's/^/# /' config.yml

^ は行頭、$ は行末を表します。

$ sed 's/^/# /' config.yml
# port: 8080
# host: example.com
# debug: false

つまずきやすいところ

-i は取り消せません。 -i を付けた瞬間にファイルが変わります。 -i なしで結果を見てから付ける、または -i.bak で控えを残す、のどちらかを必ず通してください。

/ を含む文字列を置換するときは区切りを変えます。 パスを置換しようとすると、区切りの / と中身の / が混ざって読めなくなります。 区切りは / でなくてもよいので、#| を使えます。

$ echo /home/user/project | sed 's#/home/user#/srv#'
/srv/project

パイプでも使えます。

$ grep ERROR logs/app.log | sed 's/ERROR/エラー/'
エラー connection refused
エラー timeout

ファイルが無ければ、そう言われます。

$ sed 's/nope/x/' nothing.txt
sed: can't read nothing.txt: No such file or directory

手を動かして覚える

webterm.appこのサイト

learn.webterm.app別のサイト

>_WEBTERM LEARN

WebTerm Learn|1つのコマンドから、使える状態へ

コマンドは単体で覚えるより、実際の作業の流れの中で使うほうが身につきます。順番に積み上げていくコースがあります。

コースを見る

関連するコマンド

grep / awk / tr / vim

よくある質問

sed を打ってもファイルが変わりません。
既定では結果を画面に出すだけで、ファイルには手を付けないからです。ファイルそのものを書き換えるには `-i` を付けます。まず `-i` なしで結果を確かめてから付ける、という順番が安全です。
`s/a/b/` の最後の `g` は何ですか?
その行にある一致を全部置き換える、という意味です。付けないと各行の最初の1か所だけが置き換わります。
書き換える前の中身を残せますか?
`sed -i.bak 's/前/後/' file` のように `-i` に接尾辞を付けると、`file.bak` という控えが残ります。サーバーの設定ファイルを触るときは付けておくと安心です。
特定の行だけ取り出したり消したりできますか?
`sed -n '2p'` で2行目だけ、`sed '/DEBUG/d'` で DEBUG を含む行を消せます。`-n` は「既定の出力を止める」、`p` は「この行を出す」という意味です。
vim との使い分けは?
同じ直し方を何度も繰り返すなら sed、目で見ながら直すなら vim です。sed はファイルを開かずに済むので、スクリプトの中や大量のファイルに向いています。