2012-07-27 11 views
15

मैं अपने लेटेक्स दस्तावेज़ में XXX की घटनाओं की संख्या खोजना चाहता हूं जो \XXX के रूप में कमांड के रूप में नहीं हैं। इसलिए मैं उन घटनाओं की तलाश में हूं जो बैकस्लैश से पहले नहीं हैं।grep बैकस्लैश नकारात्मक दिखने में

grep -c -e '(?<!\)XXX' test.tex #result: grep: Unmatched) or \) 
grep -c -e '(?<!\\)XXX' test.tex #result: 0 
grep -c -e "(?<!\\)XXX" test.tex #result: -bash: !\\: event not found 

उनमें से कोई भी उद्देश्य के अनुसार कार्य:

मैं निम्नलिखित की कोशिश की। असल में मैं आखिरी त्रुटि संदेश को बिल्कुल समझ नहीं पा रहा हूं।

मेरे test.tex केवल निम्नलिखित लाइनों

%test.tex 

XXX 

\XXX 

तो अपेक्षित परिणाम 1 होता है।

कोई विचार?

Ps .: मैं बैश में काम कर रहा हूं।

+0

FYI, आपके अंतिम उदाहरण में,! डबल कोट्स में इतिहास विस्तार के रूप में व्याख्या की जाती है, लेकिन '! \\' मान्य इतिहास विस्तार अभिव्यक्ति नहीं है। – chepner

उत्तर

28

न तो मानक और न ही विस्तारित नियमित अभिव्यक्ति पीछे देखने का समर्थन करते हैं। उपयोग पर्ल regexes:

grep -P '(?<!\\)\bXXX\b' test.tex 
+0

यह काम करता प्रतीत होता है, सिवाय इसके कि मैंने एक क्रॉस चेक किया था जहां मैंने 'XXX' के लिए 'XXX' के लिए और' (? Simon

+0

@ सिमॉन: शायद एक ही पंक्ति पर कई घटनाएं हैं? – choroba

1

प्रयास करें, यह --perl-regexp या -पी कमांड लाइन विकल्प के साथ पर्ल संगत नियमित अभिव्यक्ति का समर्थन करना चाहिए। शास्त्रीय पर्ल नियमित अभिव्यक्ति केवल अस्वीकृत चरित्र वर्गों का समर्थन करती है, उदाहरण के लिए, [^ ए] का मतलब है "ए" को छोड़कर कोई भी चरित्र।

आपके द्वारा दिए गए उदाहरण पर्ल-संगत नियमित अभिव्यक्तियों की तरह दिखते हैं, शास्त्रीय नहीं, और आपको जीएनयू grep का उपयोग --perl-regexp या -p कमांड लाइन विकल्प के साथ करना है या आप पीसीआरई-सक्षम grep इंस्टॉल कर सकते हैं, जैसे "pcregrep" - पीसीआरई के लिए इसे किसी कमांड लाइन विकल्प की आवश्यकता नहीं है, और इस प्रकार यह अधिक सुविधाजनक है।

इसके अलावा, आप पैटर्न को नकारात्मक दावे की तरह नहीं दिखते हैं। यह

(?!pattern) 

नहीं

(?<!pattern) 

होना चाहिए यहाँ अधिक जानकारी प्राप्त करें: यदि आप पर्ल संगत नियमित अभिव्यक्ति की तरह https://perldoc.perl.org/perlre.html

और पर्ल है, लेकिन pcregrep की जरूरत नहीं है या अपने ग्रेप नहीं करता ' टी समर्थन --perl-regexp, आप एक लाइन पर्ल स्क्रिप्ट्स कर सकते हैं जो grep की तरह काम करते हैं। पर्ल ने grep जैसे ही stdin स्वीकार किया, उदा।

ipset list | perl -e "while (<>) {if (/packets(?! 0)/){print;};}" 
+0

यह मदद करता है, लेकिन grep के लिए मेरे मैन पेज के अनुसार, -पी "अत्यधिक प्रयोगात्मक" है, क्या यह अभी भी सच है? क्या grep के साथ lookbehinds और lookaheads करने के लिए एक गैर मोती तरीका है? –

+2

@ सैंटियागोरिज़िटी: 'grep -P' बहुत लंबे समय तक यहां है और मैंने कभी नहीं सुना है कि इसे "प्रयोगात्मक" पर विचार किया जाना चाहिए।चूंकि मुझे पर्ल नियमित अभिव्यक्ति कार्यक्षमता पसंद है, इसलिए मैं हमेशा इस स्विच के साथ जाता हूं और पर्ल प्रारूप का उपयोग करता हूं। –

0

आप जीएनयू ग्रेप है, तो उपयोग करने के लिए

grep -P '(?<!\\)xxx' test.tex 
संबंधित मुद्दे