2013-12-18 8 views
9

मेरी login.txt फ़ाइल निम्न प्रविष्टियोंसकारात्मक/ग्रेप और पर्ल के साथ नकारात्मक अग्रदर्शी

abc def 
abc 123 
def abc 
abc de 
tha ewe 

जब मैं पर्ल का उपयोग कर सकारात्मक अग्रदर्शी करते हैं, मैं निम्नलिखित परिणाम हो रही है शामिल

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 

ग्रेप परिणाम

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

पर्ल नकारात्मक अग्रदर्शी के लिए डीईएफ़ एबीसी मिलान नहीं हुआ। लेकिन यह डीईबी एबीसी से मेल नहीं खाया जाना चाहिए, क्योंकि मैं एबीसी की जांच कर रहा हूं और फिर पैटर्न को डीफ़ कर रहा हूं। सही परिणाम लौटने grep।

मेरे perl पैटर्न में कुछ याद आ रही है?

+0

'(?) Abc' बिल्कुल सकारात्मक दिखने वाला रेगेक्स नहीं है; आप '(? =) abc' चाहते थे। डॉक्टर को अधिक बारीकी से दोबारा पढ़ें, मैं मानता हूं कि यह एक अविश्वसनीय रूप से घना पढ़ा गया है और प्रयोग करते समय सबसे अच्छा सीखा है ... – smci

उत्तर

6

grep में स्ट्रिंग में नई लाइन शामिल नहीं है जो यह रेगेक्स के खिलाफ जांचता है, इसलिए abc\s लाइन के अंत में एबीसी होने पर मेल नहीं खाता है। perl में chomp या -l कमांड लाइन विकल्प का उपयोग करें और आप इसी तरह के परिणाम देखेंगे।

मुझे यकीन नहीं है कि आप पर्ल और grep regexes के बीच अन्य परिवर्तन क्यों कर रहे थे; (?) क्या पूरा करना था?

3

मैं बहुत की तरह अपने regex प्रस्तोता की कोशिश करेंगे:

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

इस पर कब्जा होगा:

abc 123 
abc de 

(?) अपने नकारात्मक अग्रदर्शी regex की शुरुआत में अनावश्यक

2

है अपने perl -ne 'print if /(?)abc\s(?!def)/' में आप abc, फिर स्पेस खोजने के लिए perl पूछते हैं, तो स्ट्रिंग def नहीं होनी चाहिए। यह def abc के साथ सफलतापूर्वक मेल खाता है, क्योंकि abc के बाद \s न्यूलाइन के साथ मेल नहीं खाता है।

संबंधित मुद्दे