Linuxでは、echo foo | grep -o '^.'
最初の文字を取得するとf
期待どおりに印刷されます。 (わかりました、| cut -c1
より速いかもしれません。)
ただし、OSXでは、3つの一致(3行)で同じ結果を実行します。
f
o
o
何してるの?そのオプションがなくても-o
(私の環境では)出力色を見ると、最初の文字だけでなく行全体が一致することがわかります。
誰かが私を実現できますか?
答え1
あなたはこれが興味深い行動であることに気づきました。
これを「バグ」に分類するのは間違いです。POSIX-o
オプションが指定されていません。grep
。あなたはこれがどのように機能するのか気に入らないかもしれず、grep
BSDとGNUの違いが迷惑になることに同意します。ただし、この動作は実際にBSDのマニュアルページに記載されている内容と競合しません。まだバグだと言えば、それは、あなたのより、男性。 :)
おそらく、この代替デモがなぜ機能するのかを示します。
$ echo foofoofoo | grep -o foo
foo
foo
foo
つまり、BSDgrep
とGNUの両方grep
が表示されます。みんな最初の行だけでなく、行の一部も一致させます。違いは、BSDがgrep
一致する部分を消費してから再度一致させることでこれを行うようです。f
例から先行を削除すると、次のo
項目も一致し、次の項目も一致することがわかります。
この問題を解決する1つの方法はインストールすることです。自分で作った、そして言ったbrew install grep
。これによりGNUが提供されるため、grep
基本ggrep
バージョンと競合しません。 GNUはgrep
上記の例と同じ動作を提供しますが、いくつかの違いがあります。
$ echo foofoofoo | ggrep -o ^foo
foo
BSDはgrep
3秒を印刷しますfoo
。
基本バージョンをシンボリックリンクに置き換える場合は、一部のオペレーティングggrep
システムのアップデートがそれを置き換えることに注意してください。