【Linuxトラブル解決】sedで改行を置換できない/動作しないときの対処法

  • URLをコピーしました!
目次

はじめに

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が改行を扱えないのかを知ることで、応用的な処理にも対応できるようになります。

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