Homebrew を使って OSX に GNU sed を入れる

MacPorts は見付かったけど何故か Homebrew は見当らなかったのでメモ。

brew install gnu-sed

GNU sed の使い方

sed では無く gsed というコマンドを使う。 sed は標準で入っている /usr/bin/sed を指しているので注意。

gsed --help

どうしてわざわざ GNU sed を入れるの?

OSX に入っているの sed は BSD 由来の POSIX sed で、 GNU sed (Linux とかによく入っているやつ) は GNU 拡張が入っている。

拡張と言うからには POSIX 準拠のバイナリよりも便利になっていて、例えば -i (--in-place) というオプションがある。

これは、ファイルを開いて置換して保存するという機能を実現するコマンドなのだけれど、 MacOSX だとこのオプションは使えない。

たとえば、あなたがディレクトリ配下にある大量の .txt ファイルを開いて hoge という文字を fuga に置換したいとき、

POSIX sed の場合

for i in *.txt; do cat $i | sed "s/hoge/fuga/g" > $i.new; mv $i.new $i; done

GNU sed の場合

sed -i "s/hoge/fuga/g" *.txt

簡単。

ちょっとした解説のような何か

シェルのパイプ "|" やリダイレクト ">" を使うと入力ファイルから直接出力ファイルに書き込むことが出来ない。

というのはやってみれば分かるんだけど、以下のコマンドは正しく動作しない。

cat fuck.txt | sed "s/hoge/fuga/g" > fuck.txt

なので、一旦別のファイルに落とすのが定石なのだけれど、そうするとファイルを mv するコマンドが入る。

cat fuck.txt | sed "s/hoge/fuga/g" > fuck.txt.new
mv fuck.txt.new fuck.txt

そうすると、コマンドが非常に煩雑になってくる。 GNU sed は -i が使えるので便利。

まとめ

  • MacOSX 標準の sed はクソ
  • GNU sed を Homebrew でインストールしよう