sedでドットの後に改行を入れる方法とGNU/BSDの違い

  • Linux
  • sed
  • Shell

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

sedの置換コマンドで & と \n を組み合わせれば、ドットの後に改行を挿入できる。GNU sed(Linux標準)なら以下でいける。

ターミナル
sed 's/\./&\n/g' filename

& はマッチした文字列(ここでは .)そのものを指す。置換文字列側の \n は改行として解釈されるので、「ドットにマッチしたらドット+改行に置き換える」という動きになる。

ファイルを直接書き換える場合

-i オプションを付けるとインプレース編集(ファイルを直接上書き)になる。

ターミナル
sed -i 's/\./&\n/g' filename

ただしこれは元のファイルを問答無用で上書きするので、重要なファイルならバックアップを取っておいた方がいい。バックアップ拡張子を指定する形にすれば、コマンド一発で filename.bak が自動生成されて楽。

ターミナル
sed -i.bak 's/\./&\n/g' filename

GNU sedとBSD sedで挙動が違う

上記は全部GNU sed(Linux環境)前提の話。macOS標準のsedはBSD系で、-i の仕様が違う。BSD sedだと -i の後にバックアップ拡張子を明示的に渡す必要があって、拡張子なしでバックアップを取らない場合は空文字を渡さないといけない。

ターミナル
# BSD sed(macOS標準)の場合
sed -i '' 's/\./&\n/g' filename

これを知らずにLinux用のコマンドをそのままmacOSで実行すると、意図しない引数エラーになったりファイル名がおかしくなったりする。置換文字列内の \n の扱いも微妙に違う場合があるらしく、複雑な置換をする時はBSD版だと期待通り動かないケースがあるという話も見かける(実機未確認)。

移植性を気にするなら、GNU coreutilsをインストールして gsed を使うか、Perlの perl -pi -e に置き換えるのが無難そう。