シェル — BSD版のsedでテキストを改行「に」置換をする方法


過去にも何度かハマったが、その頃はBSDやGNUの違いがあるということも知らず、なんとなくの理解で終わってた案件。

結論

使えるならGNU版を使おう。

GNUの例

echo 'A:B:C' | sed 's/:/\n/g'
A
B
C

何の不思議もなく直感的に使える。


  • sed (GNU sed) 4.4
  • docker run --interactive --tty ubuntu /bin/bash

BSD版

こんな風に書かないといけないっぽい。

echo 'A:B:C' | sed 's/:/\
/g'

A
B
C

または

echo 'A:B:C' | sed -e 's/:/\'$'\n/g'
A
B
C

嘘だろ。

'$' の記号の意味も知らないし、調べたいとも思わないぐらい。


  • Mac OS X High Sierra
  • GNU bash, version 4.4.0(1)-release (x86_64-apple-darwin15.6.0)

BSDの他のコマンド例

以下の書き方はどれも期待しない結果。

echo 'A:B:C' | sed -e 's/:/\n/g'
AnBnC
echo 'A:B:C' | sed 's/:/\n/g'
AnBnC
echo 'A:B:C' | sed 's/:/\\n/g'
A\nB\nC
echo 'A:B:C' | sed 's/:/\r/g'
ArBrC
echo 'A:B:C' | sed 's/:/\\r/g'
A\rB\rC
echo 'A:B:C' | sed "s/:/\n/g"
AnBnC
echo 'A:B:C' | sed "s/:/\\n/g"
AnBnC
echo 'A:B:C' | sed "s/:/\\r/g"
ArBrC
echo 'A:B:C' | sed "s/:/\r/g"
ArBrC
echo 'A:B:C' | sed "s/:/\r\n/g"
ArnBrnC
echo 'A:B:C' | sed "s/:/\\r\\n/g"
ArnBrnC
echo 'A:B:C' | sed "s/:/\\\r\\\n/g"
A\r\nB\r\nC

あわせて読みたい?

Ref

Links