web-dev-qa-db-ja.com

OSXでのgrep-oの動作

Linuxでは、最初の文字を取得するためにecho foo | grep -o '^.'を実行すると、期待どおりにfが出力されます。 (私は知っています、| cut -c1はおそらくより速いでしょう。)

しかし、OSXでは、同じ結果を3回の一致(3行)で実行します。

f
o
o

WTF? -oオプションがなくても、(私の環境では)出力の色から、最初の文字だけでなく、行全体が一致していることがわかります。

誰か教えてくれませんか?

6
Patrik

それはあなたがそこで気づいた興味深い行動です。

POSIXはgrep-oオプションを指定していません であるため、これを「バグ」として分類するのは誤りです。動作が気に入らないかもしれません。BSDとGNU grepが異なるのは煩わしいことに同意しますが、この動作は実際にはBSDのマニュアルページの内容と矛盾していません。それでもバグだと言ってください、まあ、それは、 youropinion、man 。:)のようなものです。

おそらく、この代替プレゼンテーションは、それがそのように動作する理由を示します。

$ echo foofoofoo | grep -o foo
foo
foo
foo

つまり、BSDgrepとGNU grep showallの両方で、最初の部分だけでなく、行の一致する部分も表示されます違いは、BSD grepは、一致した部分を消費してから再度一致させることでそれを実装しているように見えることです。例の先頭のfを削除すると、次のoも一致することがわかります。

これに対する1つの修正は、インストールすることです Homebrew 、次にbrew install grepと言います。これにより、GNU grep as ggrepとして、ストックバージョンと衝突しません。GNU grepは、上記の例で同じ動作をします。しかし、この2つは異なります。

 $ echo foofoofoo | ggrep -o ^foo
 foo

BSD grepは、3つのfooを出力します。

ストックバージョンをggrepへのシンボリックリンクに置き換える場合は、一部のOSアップデートで置き換えられることに注意してください。

6
Warren Young