GNUのsedとBSDのsed

July 18, 2014

OSXでsedコマンドを実行した際に、正規表現が上手く動作しなかった。

TL;DR

BSD sedがイケてないのではなく、
GNU sedが独自で拡張正規表現を実装していただけっぽい。

  • OSX
['-']%
['-']% echo "hogeee" | sed -e 's/e\+//'
hogeee
['-']%
['-']% sed --version
sed: illegal option -- -
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
['x']% 
  • Linux
['-']#
['-']# echo "hogeee" | sed -e 's/e\+//'
hog
['-']#
['-']#
['-']# sed --version
GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-gnu-utils@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
['-']#

Reference

3.3 Overview of Regular Expression Syntax - GNU sed Programs
POSIX Basic Regular Expressions - Regular-Expressions.info

そもそもPOSIXで定義されている基本的な正規表現(Basic Regular Expressions)に
+やら?やら|はなくて(Extended Reuglar Exression)
GNU sedはそれを独自で使えるようにしている(GNU extension)。
BSD sedは拡張はしていないから使えない。
使うなら-Eのオプションを利用する。って感じなのかな。

追記

そういえばBSDのsedで上書きしようとする場合は

$ sed -i '' -e 's/foo/bar/' FILENAME

みたいに-i ''でファイル名に空文字与えないと
ファイルに上書きされないのもハマった記憶ある。