Linuxでは、最初の文字を取得するためにecho foo | grep -o '^.'
を実行すると、期待どおりにf
が出力されます。 (私は知っています、| cut -c1
はおそらくより速いでしょう。)
しかし、OSXでは、同じ結果を3回の一致(3行)で実行します。
f
o
o
WTF? -o
オプションがなくても、(私の環境では)出力の色から、最初の文字だけでなく、行全体が一致していることがわかります。
誰か教えてくれませんか?
それはあなたがそこで気づいた興味深い行動です。
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アップデートで置き換えられることに注意してください。