2014-10-08 78 views
1

我遇到了一些非常奇怪的行爲與grep,我不明白。我試圖從一個單詞文件中過濾常見單詞,但grep似乎忽略了一些基於它們的順序的模式。 這裏是一個小例子,顯示了故障:grep中的模式順序敏感性

測試文件:cat test.txt | fgrep -v -w -e 'an' -e 'the' -e 'a' -e 'he'

foo 
bar 

結果從命令:cat test.txt | fgrep -v -w -e 'a' -e 'an' -e 'he' -e 'the'

foo 
an 
bar 
the 

a 
foo 
an 
bar 
he 
the 

從命令結果找不到任何指示s grep應該顯示出這樣的順序敏感性,而且當我擴展到真實的輸入和過濾列表時,這顯然是一個嚴重的問題。我懷疑這實際上是安裝的grep版本中的一個錯誤 - 我在MacOS Mavericks上運行,並且無法在Ubuntu機器上重現此錯誤。

+0

兩者都用'fgrep(GNU grep)2.18'將'foo' /'bar'返回給我。 – fedorqui 2014-10-08 14:08:28

+0

與'GNU grep 2.14'一樣給我的fedorqui – whoan 2014-10-08 14:25:53

回答

1

我已經回答了我自己的問題:這是由蘋果發佈的grep版本中的錯誤(感謝fedorui和java10確認這不是預期的行爲)。 Apple發佈的當前版本是BSD grep:2.5.1-FreeBSD。

要解決此問題,請安裝GNU grep。我建議您用BREW做這個:

brew tap homebrew/dupes; brew install homebrew/dupes/grep 

這不會替換原始的grep(上誰知道還有什麼可以依賴),但安裝爲「ggrep」,然後行爲正確。

0

爲了擴大你自己的答案,OSX使用BSD grep和Linux使用GNU grep。如果你想永久取代GNU的grep BSD grep的,你可以這樣做:

brew tap homebrew/dupes 
brew install homebrew/dupes/grep --default-names 

然後你就可以使用,而不是「ggrep」命令的「grep」命令。這對依賴於GNU grep的shell腳本正常工作很有幫助。

發出你可以測試grep映射到GNU可執行上述命令後:

which grep 
/usr/local/bin/grep 

我完全切換到GNU的grep(和所有其他核心工具的)相當而回。我每天都用我的mac編程。它還沒有爆發出火焰:) YMMV。