sedで改行を置換する方法~LF/CRLF問題と -z オプション活用法~

  • URLをコピーしました!

ファイルや文字列を処理していて「改行を置換したい」というケースはよくあります。
しかし、単純に \n を書いても期待通りに動かないことが多いです。

この記事では、sedで改行を置換する際の注意点と解決方法を解説します。

目次

1. sedは1行単位で処理している

sedの基本動作は「1行を読み込んで処理し、出力する」という流れです。
つまり、行末の改行文字は パターンスペースに含まれない ため、単純に \n と書いてもマッチしません。

echo "foo
bar" | sed 's/\n/ /g'

→ 置換されずにそのまま出力されてしまいます。

2. 方法①:N コマンドで改行を取り込む

N を使うと次の行を読み込み、パターンスペースに改行ごと結合できます。

echo "foo
bar" | sed ':a;N;$!ba;s/\n/ /g'

→ 出力:

foo bar

この書き方は 「全体を1つの文字列として扱いたい」 場合に有効です。

3. 方法②:-z オプションを使う(GNU sed限定)

GNU sedには -z オプションがあり、入力を「NULL文字区切り」として扱います。
これにより、ファイル全体をひとつの文字列として処理でき、改行も普通に \n で扱えます。

echo "foo
bar" | sed -z 's/\n/ /g'

→ 出力:

foo bar

シンプルで直感的に書けるため、Linux環境であればこちらを使うのが便利です。

4. 方法③:OSごとの改行コードに注意(LFとCRLF)

  • Linux/Unix系 → 改行コードは LF (\n)
  • Windows → 改行コードは CRLF (\r\n)

Windows由来のファイルを処理すると、s/\n/ /g では置換できないケースがあります。
その場合は \r\n を対象にしましょう。

# Windowsの改行コード対応
sed -z 's/\r\n/ /g' file.txt

5. まとめ

  • sedは1行単位処理なので、改行は普通に扱えない
  • N コマンド+ループで改行を含める方法がある
  • GNU sedなら -z オプションがシンプルでおすすめ
  • Windows由来のファイルは改行コード(CRLF)に注意
よくあるエラーと解決方法まとめ
目次