隙あらば寝る

うぇぶのかいしゃではたらくえんじにあがかいています

pcregrepとGNU grepの-P

先日pcregrepを紹介したが、grep -Pもあるとコメントで教えてもらった。

(色々と調べるきっかけにもなりました、南の島さんありがとうございます)

yoru9zine.hatenablog.com

GNU grepではpcreサポートも実装されているようで、以下のようにmanにも記載されていた。

       -P, --perl-regexp
              Interpret the pattern as a Perl-compatible regular expression (PCRE).  This is highly experimental and grep -P may warn of unimplemented features.

この前はmacのmanをみてしまったので気づかなかった。。。(macGNU grepではない)

と、ここで違いが気になってきたので少しだけ出自を調べてみた。

pcregrep

pcregrepはpcre.orgで配布されているpcreライブラリに付属している。

そもそもpcreとはperl5互換の正規表現ライブラリのことで、perl5で使える正規表現APIとして提供するライブラリがlibpcreということのようだ。

perlはlibpcreを使っておらず、厳密にはlibpcreとperl5の正規表現は少し違うようだ。

Perl Compatible Regular Expressions - Wikipedia

ということで、pcregrepはGNU grepとはまた別の開発主体によってメンテナンスされている、あくまでクローンということだと思う。

(GNU)grep -P

GNU grepは言わずとしれたGNUのソフトウェアで、linuxでは基本的に利用できると思って間違いないと思う。

GNU grepには-Pオプションがあり内部的にはlibpcreを使っているようだった。

つまりオプション解析や出力の処理などはいつも使っているgrepそのままで、マッチング処理にlibpcreを用いることができるということのようだ。

この-P自体はPOSIXで定められていないようなので、あくまでGNU grepの独自拡張ということになると思う。

そのため、mac等、非GNUgrepを使っているOSでは利用できなさそうだ。

まとめ

結局はlibpcreが処理するようだ。じゃあpcregrepを覚えておけばOKかな?と思ったあなた。間違いです。

unix.stackexchange.com

libpcreは確かに多く使われているが、それが当たり前ではない環境もあるので、

少しでも多くの環境をサポートするならperlを使えと言われている。

世間は厳しい。

と、半分冗談は置いておいて、以下は自分なりに考えた結果。

linuxで生活しているならならgrep -Pが良いと思う。なぜならGNU拡張オプションが使えるので色々と楽だろう。

pcregrepは普段使いするわけではないので細かい挙動が違い、細かい場面でハマる可能性がある。

一方、macも使っているならpcregrepになると思う。brewなどでggrepを入れても良いとは思うが、結局コマンド名が変わるのはわかりにくい。

軽く使ってみている限りはpcregrepでも全く問題はないので、

凝った正規表現を使うならpcregrepで統一するというのは現実的だと思う。

ということで、両方頭に置いておいて、状況に合わせてうまく使えるようにしておきたい。