はじめに
sedはテキスト処理を効率化するコマンドとして、日々の開発や運用で広く使われています。特に行単位での削除はログ整形やデータ前処理で頻繁に登場しますが、初学者にとっては書き方や挙動が分かりづらいことも多いです。
この記事では、シンプルな例をもとにsedで行を削除する方法を丁寧に解説し、つまずきやすいポイントもあわせて紹介します。
参考: FreeBSD Manual Pages - sed
sedで特定の行を削除するコマンドの仕組み
今回使用するコマンドは以下です。
このコマンドは「2行目を削除する」という意味です。sedでは「行番号 + d」で指定した行を削除できます。
| 要素 | 意味 |
|---|---|
| 2 | 対象となる行番号 |
| d | delete(削除)命令 |
つまり、2行目だけが出力結果から除外されます。
実行前の状態
まずは対象となるファイルを作成します。
cat << 'EOF' > input.txt
hello
sed
# comment
command
world
EOF
input.txtの内容は以下です。
hello
sed
# comment
command
world
実行後の状態
コマンドを実行します。
出力結果は以下です。
hello
# comment
command
world
input.txtの2行目にあった「sed」が削除されています。
実行画像

GNU sedとBSD sedの挙動の違い
macOSなどで使われるBSD sedとLinuxで一般的なGNU sedにはいくつか違いがあります。特に注意したいのはインプレース編集です。
| 項目 | BSD sed | GNU sed |
|---|---|---|
| -iオプション | 拡張子必須 | 拡張子不要 |
| 例 | -i '' | -i |
BSD sedではバックアップ拡張子を空文字で指定する必要があります。
複数行の削除
複数の行を削除する場合は範囲指定を使います。
| 記述 | 意味 |
|---|---|
| 2,3 | 2行目から3行目まで |
| d | 指定範囲を削除 |
これにより2行目と3行目がまとめて削除されます。
検索パターンで行の削除
特定の文字列を含む行を削除する方法です。
| 記述 | 意味 |
|---|---|
| /world/ | worldを含む行 |
| d | 該当行を削除 |
検索パターン以外の行を削除
特定の行だけを残したい場合です。
| 記述 | 意味 |
|---|---|
| /world/ | worldを含む行 |
| ! | 条件の否定 |
| d | それ以外を削除 |
コメント行の削除
コメント行(#で始まる行)を削除するには以下を使います。
| 記述 | 意味 |
|---|---|
| ^# | 行頭が# |
| d | 該当行を削除 |
空行の削除
空行を削除する方法です。
| 記述 | 意味 |
|---|---|
| ^$ | 空の行 |
| d | 該当行を削除 |
ファイルへの書き込み
実際にファイルを書き換える場合は以下を使います。
| 記述 | 意味 |
|---|---|
| -i '' | 直接ファイルを編集(BSD形式) |
| 2d | 2行目を削除 |
逆引き
よくあるケースを紹介します。
例1: 3行目を削除
cat << 'EOF' > sample.txt
a
b
c
d
EOF
例2: errorを含む行を削除
cat << 'EOF' > sample.txt
ok
error
ok
EOF
例3: 空行だけ削除
cat << 'EOF' > sample.txt
a
b
EOF
オプション指定ミスによるエラー
sedのオプションを誤ると意図しない結果になります。
例:
BSD sedではエラーになります。
正規表現の誤りによる削除ミス
例えば以下のようなケースです。
空行以外のすべての行が削除されてしまいます。ドットは任意の1文字を意味するためです。
範囲指定の誤解による想定外の削除
2行目以降すべて削除されます。$は最終行を意味します。
sedで行を削除するポイント整理
sedはシンプルながら非常に強力なコマンドです。行番号で削除する方法、検索パターンで削除する方法を使い分けることで、さまざまなテキスト処理に対応できます。
特に初学者は以下を意識すると理解が深まります。
- 行番号指定とパターン指定の違いを理解する
- BSD sedとGNU sedの違いに注意する
- 実際にファイルを作って試す
これらを意識しながら練習すると、sedの操作に自信が持てるようになります。
