2017-03-04 78 views
0

我想找到所有不包含參數中包含sizeof()的malloc函數。所以我做了正則表達式 - malloc\((?!.*sizeof\().*\);如何使用否定「?!」在grep reg exp

問題是,它在reg exp online tolls工作,但不是當我嘗試在grep中使用它。

cat file | grep "malloc\((?!.*sizeof\().*\);" 

答:

bash: !.sizeof\: event not found 

任何想法?也許 」?!」在grep的REG EXPS」不工作

+0

此無關使用grep或正則表達式。錯誤來自bash。 grep甚至沒有運行。 – melpomene

+3

'!'將會被[* history expansion *]擴展(https://www.gnu.org/software/bash/manual/html_node/Event-Designators.html#Event-Designators) – hek2mgl

回答

3

Grep默認引擎遵循BRE語法,因此使用負向預測(?!...)是沒有意義的,並且可能會導致不需要的行爲。設置-P(: - Perl的正則表達式),以便能夠使用它:

cat file | grep -P 'malloc\((?!.*sizeof\().*\);' 
+2

您還應該指出,歷史擴展(導致OP看到的錯誤)被使用單引號而不是雙引號抑制。 – chepner

+0

非常感謝,那就是我想知道的:) – anticol

1

我會用awk

awk '/malloc/ && !/sizeof/' file 

如果你需要使用grep,讓我們說了一門功課,你需要使用grep兩次:

grep malloc file | grep -v sizeof 

-v恢復匹配,這意味着grep將輸出與模式不匹配的行。


你說:

的問題是,它工作在REG EXP在線工具,但不是當我嘗試在grep來使用它。

它看起來像你的在線工具不使用POSIX regular expressions作爲grep。請參考POSIX文檔(或者閱讀man grep

+0

我需要使用grep ,那是問題,否則我會這麼做 – anticol

+0

使用grep兩次:'grep malloc file | grep -v sizeof' – hek2mgl

+0

@anticol爲什麼你需要使用grep? – melpomene

1

您正在使用"..."。 Bash評估"..."內的一些自己的構造,如$PWD`pwd`!$

檢查man bash對於!表達式。你可以使用\來阻止bash試圖評估和失敗開始在! ...通過!到grep。

+0

你的正則表達式看起來像一個完整的perl(pcre)正則表達式。 Grep不會理解它;沒有嘗試,我敢打賭egrep不會是 – Mischa