2013-10-27

改行 (\n) で置換するなら sed じゃなくて tr を使う

結論としては sed で \n (改行) を扱うのはやっかいなので tr を使いましょう。

今日、ついに bash から zsh に乗り換えようとしていて、日曜を .zshrc の整備に費やしていました。

そこで homebrew に brew doctor という PATH などをチェックしてくれるいいコマンドがあるのでそれを基準に整備していたのですが、どうにも PATH が二重三重に読み込まれている模様。

それをスクリプトで確認しようとおもむろに sed でワンライナーを書き始めたのですが、: を \n に置換する方法が分からない。


やりたいこととしては、

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

↑こういうのを、

/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

↑こうしたかった。


そこで初めは挫折して ruby で書きました。もちろんうまく動いてくれます。

echo $PATH | ruby -pe '$_.gsub!(/:/,"\n")'

しかしやはり気になったのでシェルのコマンドでどうやって書くのか調べてみました。その結果がこちら。

echo $PATH | tr ':' '\n'

ちなみに、うまく動いてくれなかったコマンドはこいつです。

echo $PATH | sed -e "s/:/\\n/g"  # Doesn't work as intended

なるほど tr って使い所よく分からないなぁと思っていたがこうやって使うのか。

sed でうまく行かなかった原因は、よくわかっていません。改行は GNU バージョンならすんなりいくそうですが手元の Mac デフォルトのやつが BSD バージョンだったのでうまくいかなかったのかもしれません。