2013-12-18 12 views
9

meine login.txt Datei enthält folgende EinträgePositiv/Negativ Look-Ahead mit grep und Perl

abc def 
abc 123 
def abc 
abc de 
tha ewe 

wenn ich die positive Vorschau mit Perl zu tun, ich bin immer folgendes Ergebnis

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

wenn Ich benutze Grep Ich erhalte das folgende Ergebnis

negativ betrachtet Ergebnisse wie folgt aus Perl und Grep.

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

grep Ergebnis

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

perl entsprach dem def ABC für die negative lookahead. aber es sollte nicht mit def abc übereinstimmen, da ich abc und dann def-Muster überprüfe. grep gibt das korrekte Ergebnis zurück.

fehlt etwas in meinem Perlmuster?

+0

'(?) Abc' ist überhaupt kein positiver Lookahead Regex; du wolltest '(? =) abc'. Lesen Sie den Dokumentarfilm genauer durch, ich gebe zu, dass es eine unglaublich dichte Lektüre ist und am besten beim Experimentieren gelernt wird ... – smci

Antwort

6

grep enthält den Zeilenumbruch nicht in der Zeichenkette, die er mit der Regex vergleicht, so dass abc\s nicht übereinstimmt, wenn sich abc am Ende der Zeile befindet. chomp in Perl oder verwenden Sie die Befehlszeilenoption -l und Sie werden ähnliche Ergebnisse sehen.

Ich bin mir nicht sicher, warum Sie andere Änderungen zwischen den Perl- und Grep-Regexen vorgenommen haben; Was sollte die (?) erreichen?

3

würde ich versuchen, Ihre regex Verankerung wie so:

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

Diese erfassen würde:

abc 123 
abc de 

Die (?) am Anfang Ihrer negativen Look-Ahead-regex ist redundant

2

In Ihrem perl -ne 'print if /(?)abc\s(?!def)/' Sie fragen Perl abc, dann Leerzeichen, dann Zeichenfolge sollte nicht def sein. Dies ist erfolgreich mit def abc übereinstimmt, denn es gibt keine def nach abc hier und \s entspricht newline.