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 に置換したいとき、
for i in *.txt; do cat $i | sed "s/hoge/fuga/g" > $i.new; mv $i.new $i; done
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 が使えるので便利。