2017-08-28 191 views
1

對於segfault命令,它必須運行在一個包含文本文件的目錄中。沒有或組,它不會出現分段錯誤。爲什麼下面的grep命令會出錯:grep -Pz「(。| n)*」*

+0

正如手冊頁所說,'grep -P'是「高度實驗性的」,所以YMMV和使用風險自負。我個人會避免它,因爲作者明確警告瘟疫,但我看到其他人提倡它... –

+0

你是否想要匹配的時期或「任何字符,但行終止符」?我的假設是,你正試圖在句子末尾或換行符的某個時段進行匹配。在您的示例正則表達式中,句號將基本匹配所有內容,在句號與文本匹配的情況下,您需要使用反斜槓進行轉義。 – user3661841

+0

也許你的_grep_確實是一種病毒。 – sln

回答

0

爲什麼以下grep命令段錯誤

因爲在它的錯誤。

在用戶應用程序的任何碰撞,如grepcpls等是錯誤在上述實用,你應該將其與一組重現它需要幾個簡單的步驟報告。

0

它看起來類似於另一個bug:編號爲libpcre2的「git grep」有時會觸發段錯誤。
而隨着Git 2.16(Q1 2018),這個問題正在解決之中。

請參閱commit a25b908commit ce9a257(2017年11月23日)作者Ævar Arnfjörð Bjarmason (avar)
(由Junio C Hamano -- gitster --commit b3f04e5合併,2017年12月13日)

grep:固定下-P + PCRE2 <=10.30 + (*NO_JIT)

段錯誤修正的錯誤中的PCRE2模式下JIT(最常見的運行時配置)編譯。用(*NO_JIT)動詞的任何模式將 段錯誤在任何當前發佈PCRE2版本:

$ git grep -P '(*NO_JIT)hi.*there' 
    Segmentation fault 

那這個segfaulted是PCRE2本身就是一個錯誤,報告之後(「How am I supposed to use PCRE2 JIT in the face of (*NO_JIT) ?」)上pcre-dev,它被固定在一個尚未即將發佈的PCRE版本(推測首先發布爲10.31)。
現在就一起死:

$ git grep -P '(*NO_JIT)hi.*there' 
    fatal: pcre2_jit_match failed with error code -45: bad JIT option 

但錯誤的原因是其歷史可以追溯到我的 94da919(」 grep:增加對PCRE V2" 支持我們自己的代碼,2017年6月1日, Git 2.14-rc0)。

正如評論在更詳細地解釋在這裏被添加,它不是 足以只是檢查pcre2_config(),看是否JIT應當 使用,pcre2_pattern_info()也必須問。

這是我在用傳遞給git的模式中的PCRE2 動詞擺弄時發現的。我不希望git 的任何用戶遇到這種情況,因爲將PCRE2動詞 傳遞給庫,以及(* NO_JIT) 本身的相對默默無聞。

同樣,這可能不是完全一樣的錯誤,但你可能會考慮測試你的git grep再度Git的2.16是版本,看看問題是否依然存在。