はじめに
Linuxで sed
を使ってテキスト処理をしていると、改行を置換したいのに思った通り動作しない という場面によく出会います。
例えばこんなケース:
sed 's/\n/ /g' file.txt
実行してもエラーは出ないものの、改行がそのまま残っている…。
これは「sedは通常の正規表現で改行を扱えない」ことが原因です。
この記事では、改行置換が失敗する理由と、その正しい解決方法をわかりやすく解説します。
sedで改行が扱えない理由
sed
は基本的に 1行ごとに処理を行うストリームエディタ です。
そのため、通常の正規表現における \n
は「改行文字」として解釈されません。
sed 's/\n/ /g'
→ 無視されるsed 's/$/ /'
→ 行末をスペースに置換(これは有効)
つまり「1行の中には改行が存在しない」と認識しているため、\n
を直接指定しても置換対象にならないのです。
解決方法
方法1: 改行をエスケープシーケンスで表現する
環境によっては $'...'
形式を使い、シェル側で \n
を解釈させることで改行を扱える場合があります。
sed $'s/\n/ /g' file.txt
なぜこれで動くのか?
Bashの $'...'
構文は \n
を本物の改行文字に変換してからsedに渡すため、sedが改行を正しく認識できるからです。
⚠️ 注意: すべての環境で動くわけではなく、環境依存性が高い方法です。
方法2: 改行を一時的に別文字に変換してから置換
tr
コマンドや awk
と組み合わせて、改行を一度別の記号に変換してからsedで置換する手法です。
# 改行を特殊文字に変換 → sedで置換 → 元に戻す
tr '\n' '\r' < file.txt | sed 's/\r/ /g'
なぜこれで動くのか?
sed単体では改行を扱えないため、tr
で一時的に「扱いやすい文字」に変換しているのです。
方法3: -z
オプションを使う(GNU sed限定)
GNU sedには -z
オプションがあり、改行も含めて「入力全体を1行」として扱うことができます。
sed -z 's/\n/ /g' file.txt
これにより、ファイル内の改行文字がすべて置換されます。
なぜこれで解決できるのか?
-z
を指定すると、通常の「行単位の処理」ではなく「NUL区切りの1行処理」として読み込むため、改行文字も検索対象に含まれるようになります。
⚠️ 注意: macOSや一部UNIX環境のsedには -z
が存在しません。
方法4: perlやawkを利用する
環境依存を避けるなら perl
を使うのも有効です。
perl -pe 's/\n/ /g' file.txt
perl
はデフォルトで改行を扱えるため、sedより柔軟です。
改行コード(LF/CRLF)問題にも注意
改行が置換できないのは、単にsedの仕様だけでなく 改行コードの違い が原因の場合もあります。
- Linux / macOS:
LF (\n)
- Windows:
CRLF (\r\n)
もしファイルがWindows由来の場合、sed 's/\n/ /g'
が効かないのは「実際には \r\n
だから」かもしれません。
確認方法
file file.txt
解決方法
# CRLF → LF に変換
dos2unix file.txt
まとめ
- sedは基本的に「1行ごとに処理する」ため、改行を扱えない
- 解決方法は環境に応じて次の通り
$'...'
を使ってシェル側で改行を解釈tr
などで一時変換してからsedで処理- GNU sedなら
-z
オプションが最も便利 - 改行コード(LF/CRLF)の違いも要チェック
👉 ポイントは「sed単体では改行が苦手」という前提を理解することです。
単なる暗記ではなく、なぜsedが改行を扱えないのかを知ることで、応用的な処理にも対応できるようになります。

よくあるエラーと解決方法まとめ
