2013-03-29 82 views
0

由於grep命令沒有返回我期望它返回的結果,所以我非常擔心非邊界詞的概念。我找只匹配的malloc單詞而不是 lmmmalloc該線,所以我決定用:與非邊界詞相匹配

grep -inr '\bmalloc\b' . 

其返回以下:

./xxxx.xx:918: /* Free the malloc before exiting the function. */ 

修改grep命令檢索後所有包含 lmmmalloc的行使用以下命令:

grep -inr '\Bmalloc\B' . 

我期望\ B返回包含子字符串 malloc的行,而不是與之前發佈的結果相同。我希望結果將如下相同:

grep -inr '\blmmmalloc\b' 
./xxxx.xx:376: string_temp = (char *) lmmmalloc (cxp, 

我的理解有缺陷的,如果是的話,可能會有人請澄清和糾正grep命令?

我使用的是GNU grep 2.5.1。

+0

我運行OSX(BSD這樣的grep),但'\ B'爲我工作。你嘗試過'\ W'嗎?如果'malloc'是一行上的直接字符序列,但是否則應該是等價的。例如,'grep -inr'\ Wmalloc' – jmar777

+0

@ jmar777你的grep命令確實有效,但我仍然不明白爲什麼\ B不會僅僅用lmmmalloc找到行。 – Vivek

+0

不幸的是,我對grep或者GNU/BSD版本之間的差異不甚瞭解,所以不能真正對此進行評論。絕對奇怪,因爲我期望'\ B'被支持... – jmar777

回答

0

使用單詞邊界像這樣的grep:

grep -inr "\<malloc\>" 
+0

這似乎與grep -inr'\ bmalloc \ b'命令做同樣的事情。手冊頁討論了符號\ < and \>與\ b版本之間的細微區別,其中前者匹配單詞前後的空字符串,後者匹配單詞邊緣的空字符串。你知道\和\ b之間的區別嗎? – Vivek

+0

根據http://www.regular-expressions.info/wordboundaries.html:GNU POSIX正則表達式擴展增加了對\ b和\ B單詞邊界的支持,如上所述。 GNU也使用自己的語法來開始詞和詞末。 \ <匹配單詞的開頭,如Tcl的\ m。 \>匹配一個單詞的末尾,例如Tcl的\ M.' – anubhava

1

\Bmalloc\B意味着m必須一個文字字符前面c必須一個文字字符遵循。如果你希望它匹配immmalloc,離開第二\b,因爲它是:

grep -inr '\Bmalloc\b' . 
+0

這返回與grep -inr'\ bmalloc \ b'相同的結果,並且不返回任何帶有字符串'lmmmalloc'的行。 – Vivek

+0

我不明白爲什麼。如果添加'-P'選項(即使用Perl語法)會發生什麼? –

+0

沒有運氣與grep -inrP「\ Bmalloc \ b」。 – Vivek

相關問題