LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

sedで拡張正規表現 (ERE) を使う時は -r ではなく -E オプション(POSIX Issue 8 準拠)を使いましょう

TL;DR

  • POSIX Issue 8 で 拡張正規表現 (ERE) を使うための -E オプションが標準化されます。
    • もう sed で 基本正規表現 (BRE) を使う必要はありません。
    • POSIX Issue 8 は 2022 年後期予定ですが今使えるのであれば待つ必要はありません。
    • -r オプションは -E と同じ意味の古いオプションです。
  • s/foo/bar/i ← この i (ignore case) も POSIX Issue 8 で標準化されます。
  • grep でも -E オプションで ERE が使えます。
    • 昔は POSIX で標準化されていた(?)egrep も POSIX.1-2001 で廃止されています。
  • grep -E で ERE、sed -E で ERE、awk は最初から ERE です。

標準化に至った経緯

移植性について

GNU sed は かなり古い時代から ERE を有効にするオプションとして -r を持っていました。ここ によると GNU sed 4.0.6 (2003-03-18) から実装されているらしいです。(ただ試したら 3.02 ではドキュメント化されていませんでしたが使えました)。一般的には Debian 3.1 (2005) 頃から使えるようになったと考えて良いでしょう。

そして GNU sed 4.2.0 (2009-04-30) で -r オプションの移植性があるエイリアスとして -E オプションが追加されました。Debian 6.0 (2011) 頃より使えるようになったようです。ただしこの頃はまだ互換性のために追加されたアンドキュメントなオプションという扱いで sed --help に記載されるようになったのは Debian 9 からです。そのため -E は比較的最近追加されたオプションだと勘違いしている人も多そうです。

一方 FreeBSD ではかなり早く 4.1.1 (1993) の時点で -E オプションに対応していたようです。NetBSD も 1.6 (1993) の時点で対応していました。OpenBSD は少し遅く 4.7 (2010) のようです。オープンソースの世界では 10 年ぐらい前から使えていたと考えて良いでしょう。

商用 Unix は、いつもの通り対応していませんね(Solaris 11AIX 7.2)。まあこちらは POSIX で標準化された後に遅れて対応することになるのでしょう。

まとめ

ということで、sed -Ei フラグは POSIX Issue 8 標準化されるので(商用 Unix を考慮しなくていいなら)もう安心して使えるようになったということです。POSIX も少しずつ変わっていますね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0