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か所だけが置き換わります。
$ 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 directorywebterm.appこのサイト
ターミナル基礎
よく使うコマンドを学ぶ
learn.webterm.app別のサイト
