2013-12-18 89 views
9

我的login.txt文件包含以下條目正/負使用grep和Perl前瞻

abc def 
abc 123 
def abc 
abc de 
tha ewe 

當我用perl做積極的前瞻,我得到以下結果

cat login.txt | perl -ne 'print if /(?)abc\s(?=def)/' 
abc def 

時我使用grep我得到以下結果

cat login.txt | grep -P '(?<=abc)\s(?=def)' 
abc def 

從perl和grep中產生負面的結果如下。

cat login | perl -ne 'print if /(?)abc\s(?!def)/' 
abc 123 
def abc 
abc de 

grep的結果

cat login.txt | grep -P '(?<=abc)\s(?!def)' 
abc 123 
abc de 

perl的匹配ABC DEF用於負先行。但它不應該匹配def abc,因爲我正在檢查abc然後def模式。 grep返回正確的結果。

是我的perl模式中缺少的東西?

+0

'(?)abc'根本不是一個積極的lookahead正則表達式;你想'(?=)abc'。仔細閱讀文檔,我承認這是一個難以置信的密集閱讀,最好在實驗時學習...... – smci

回答

6

grep不包含字符串中的換行符,它檢查的是正則表達式,所以當abc位於行尾時,abc\s不匹配。 chomp in perl或者使用-l命令行選項,你會看到類似的結果。

我不確定你爲什麼要在perl和grep正則表達式之間做其他更改; (?)應該完成什麼?

3

我會盡量固定你的正則表達式,像這樣:

/(^abc\s+(?!def).+)/ 

這將捕獲:

abc 123 
abc de 

(?)你負前瞻正則表達式的開頭是多餘的

2

在你perl -ne 'print if /(?)abc\s(?!def)/'你問perl找到abc,然後空格,那麼字符串不應該是def。這與def abc成功匹配,因爲abc此處沒有def\s與換行符匹配。