2010-08-26 59 views
3

有人可以解釋爲什麼此代碼不能按預期工作? 我希望它只匹配第一個字符,它與字面字符,但通配符(。)和字符類行爲奇怪:grep:「^」。不正確

我用-o只是爲了演示如何匹配,它doesn根本不會改變什麼比賽。

$ echo foo | grep -o '^.' 
f 
o 
o 

一些更意外的行爲:如預期在這些情況下

$ echo foobarbazquux | grep -o '^[foarqux]' 
f 
o 
o 

$ echo foobarbazquux | grep -o '^.[^u]' 
fo 
ob 
ar 
ba 
zq 

Esentially開頭的行的匹配(^)沒有表現。有什麼辦法可以讓它更正常嗎?

+0

如果您不使用-o,它確實工作錯了嗎?我的猜測是-o輸出可能在應用錨點之前產生。 – ninjalj 2010-08-26 22:41:20

+2

我看到與GNU grep 2.5.1完全相同的行爲。就好像grep在每次比賽結束後重新開始搜索一樣。另一個測試用例:'echo foobarfoo | egrep -o'foo |^bar''顯示'foo','bar','foo'。 – 2010-08-26 22:41:24

+0

對於它的價值,我可以用grep 2.5.1在我的OSX終端上重現此行爲。更神祕的是,'$'按預期工作 - 不是'^'。 – 2010-08-26 22:41:32

回答

0

從我的Ubuntu 10.04中:

[email protected]:~$ echo foo | grep -o '^.' 
f 
[email protected]:~$ echo foobarbazquux | grep -o '^[foarqux]' 
f 
[email protected]:~$ echo foobarbazquux | grep -o '^.[^u]' 
fo 
[email protected]:~$ grep --version 
GNU grep 2.5.4 

有一系列的環境變量的grep將尋找控制其行爲/輸出,所以檢查是否有這些的設置。很可能你已經設置了「GREP_OPTIONS」。

+0

2.5.1在這裏,表現得像bukzor的,看到我對這個問題的評論。 – ninjalj 2010-08-26 22:42:16

+0

即使我使用'env -i'來清除環境,我也會得到與OP相同的行爲。 – 2010-08-26 22:44:16