過去にも何度かハマったが、その頃は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
- Shell — How to detect some command using GNU or BSD ? ( man sed | grep GNU )
- regex - How do I use a new-line replacement in a BSD sed? - Stack Overflow
Links
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。