はじめに
テキスト処理で頻繁に登場するのが「改行」の扱いです。特にsedは、シンプルながら強力にテキストを加工できるコマンドであり、改行の挿入・削除・置換も柔軟に行えます。
ただし初学者にとっては、「改行がうまく入らない」「BSDとGNUで挙動が違う」といったポイントでつまずきやすいのも事実です。本記事では、実際のコマンド例をもとに、sedで改行を扱う方法をわかりやすく解説します。
参考: GNU sed
sedで改行を先頭に挿入するコマンドの仕組み
今回使用するコマンドは以下です。
sed '1i\
\
' input.txt
このコマンドは、ファイルの先頭に空行(改行)を挿入する処理を行います。
| 要素 | 説明 |
|---|---|
| 1 | 1行目を指定 |
| i | 指定行の前に挿入 |
| \ | 改行を表現するためのエスケープ |
| 空行 | 実際に挿入される改行 |
| input.txt | 対象ファイル |
BSD版のsedでは、このようにバックスラッシュの後に改行を書く必要がある点に注意が必要です。
実行前の状態
まずはファイルを作成します。
cat << 'EOF' > input.txt
hello
world
EOF
input.txtの内容は以下です。
hello
world
実行後の状態
コマンドを実行します。
sed '1i\
\
' input.txt
出力結果は以下です。
hello
world
先頭に1行の空行(改行)が追加されていることが確認できます。
実行画像

GNU sedとBSD sedの挙動の違い
GNU sedでは、改行の扱いが簡潔です。例えば空行追加は次のように書けます。
sed '1i\'$'\n' input.txt
または
sed '1i\
' input.txt
BSD版は「バックスラッシュ+改行」を厳密に書く必要があり、ここが混乱しやすいポイントです。
改行をスペースに置換するsedコマンドの仕組み
以下のコマンドを使用します。
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' input.txt
コマンドの仕組み
| 要素 | 説明 |
|---|---|
| -e | 複数コマンドを指定 |
| :a | ラベルaを定義 |
| N | 次の行をパターンスペースに追加 |
| $!ba | 最終行でなければラベルaへ戻る |
| s/\n/ /g | 改行をスペースに置換 |
処理の流れ
- :aでループ開始位置を定義
- Nで次行をパターンスペースに追加
- $!baで全行を1つにまとめる
- 最後に改行をスペースへ置換
なぜこの方法が必要か
通常、sedは1行ずつ処理します。そのため改行を対象にするには、全行をパターンスペースに読み込む必要があります。
パターンスペースとホールドスペース
- パターンスペース:現在処理中のデータ領域
- ホールドスペース:一時保存用
今回の処理はパターンスペースのみを使用しています。
trコマンドで改行をスペースに変換する方法
同じ処理はtrコマンドでも可能です。
tr '\n' ' ' < input.txt
シンプルですが、複雑な制御はsedの方が得意です。
sedで末尾に改行を追加するコマンドの仕組み
sed '$a\
\
' input.txt
| 要素 | 説明 |
|---|---|
| $ | 最終行 |
| a | 行の後に追加 |
| \ | 改行エスケープ |
| 空行 | 実際の改行 |
sedでファイルへ直接書き込む方法
sed -i '' '1i\
\
' input.txt
BSD版では-i ''を指定する必要があります。
sedで特定の文字を改行に置換する方法
例えばカンマを改行に変換する場合です。
sed 's/,/\n/g' input.txt
改行はバックスラッシュ+nで表現します。
逆引きで理解するsed改行操作
例1:先頭に改行を追加
cat << 'EOF' > sample1.txt
a
b
EOF
sed '1i\
\
' sample1.txt
例2:改行を削除して1行にする
cat << 'EOF' > sample2.txt
a
b
EOF
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n//g' sample2.txt
例3:カンマを改行に変換
cat << 'EOF' > sample3.txt
a,b,c
EOF
sed 's/,/\n/g' sample3.txt
よくあるsed改行処理の失敗パターン
1:バックスラッシュの後に改行を書かない
sed '1i\' input.txt
→ input.txtの内容がそのまま表示されます
2:BSDで-iオプションを誤る
sed -i '1i\
\
' input.txt
→ -iの後に'(シングルクオーテーション)が2つ必要
3:改行を直接\nで書く
sed '1i\n' input.txt
→ エラーになります
sedと改行操作の理解を深めるまとめ
sedで改行を扱うには、「行単位処理」という前提を理解することが重要です。特にBSD版では、改行の書き方に独自のルールがあるため注意が必要です。
改行の挿入・削除・置換を使いこなせれば、ログ加工やデータ整形の効率が大きく向上します。まずは基本のコマンドから試し、少しずつ応用へ広げていくのがおすすめです。

