pcregrepとGNU grepの-P
先日pcregrepを紹介したが、grep -Pもあるとコメントで教えてもらった。
(色々と調べるきっかけにもなりました、南の島さんありがとうございます)
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をみてしまったので気づかなかった。。。(macはGNU 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等、非GNUのgrepを使っているOSでは利用できなさそうだ。
まとめ
結局はlibpcreが処理するようだ。じゃあpcregrepを覚えておけばOKかな?と思ったあなた。間違いです。
libpcreは確かに多く使われているが、それが当たり前ではない環境もあるので、
少しでも多くの環境をサポートするならperlを使えと言われている。
世間は厳しい。
と、半分冗談は置いておいて、以下は自分なりに考えた結果。
linuxで生活しているならならgrep -Pが良いと思う。なぜならGNU拡張オプションが使えるので色々と楽だろう。
pcregrepは普段使いするわけではないので細かい挙動が違い、細かい場面でハマる可能性がある。
一方、macも使っているならpcregrepになると思う。brewなどでggrepを入れても良いとは思うが、結局コマンド名が変わるのはわかりにくい。
軽く使ってみている限りはpcregrepでも全く問題はないので、
凝った正規表現を使うならpcregrepで統一するというのは現実的だと思う。
ということで、両方頭に置いておいて、状況に合わせてうまく使えるようにしておきたい。