बैश में दोहरा चरित्र खोजने के लिए नियमित अभिव्यक्ति


10

मैं एक नियमित अभिव्यक्ति की तलाश कर रहा हूं जो कमांड लाइन (बाश) पर एक पाठ, लिस्टिंग आदि में दोहरे पात्रों के सभी घटनाओं को पाता है।

मुख्य प्रश्न : वहाँ की तरह दृश्यों के लिए देखो करने के लिए एक आसान तरीका है aa, ll, ttttt, आदि, जहां एक परिभाषित करता है एक नियमित अभिव्यक्ति है कि के साथ एक ही चरित्र की n आवृत्तियां के लिए दिखता है? मैं जिस चीज की तलाश कर रहा हूं वह बहुत ही बुनियादी स्तर पर इसे हासिल कर रही है। कमांड लाइन पर। एक लिनक्स शेल में।

काफी शोध के बाद मैं निम्नलिखित उत्तरों पर आया - और उनसे उत्पन्न प्रश्न, इस प्रकार उन्होंने मुझे केवल एक संकेत दिया जहां समाधान हो सकता है। परंतु:

a) (e) grep और बैकस्लैश समस्या

  • grep 'a\{2\}' की खोज aa
  • egrep'a{2}' की खोज aa

प्रश्न: क्या बैकलैश सेट करने की आवश्यकता वास्तव में मेरे द्वारा उपयोग की जाने वाली कमांड के लिए बाध्य है? यदि हां, तो क्या कोई मुझे संकेत दे सकता है कि यहां (e) grep का उपयोग करते समय और क्या ध्यान रखा जाए?

ख) मुझे यह उत्तर मेरे प्रश्न के लिए मिला , हालाँकि यह वैसा नहीं है जैसा मैं देख रहा था:

grep -E '(.)\1' filenameएक ही चरित्र के साथ एक से अधिक बार प्रदर्शित होने वाली प्रविष्टियों की तलाश करता है, लेकिन यह नहीं पूछता कि कितनी बार । यह वह चीज है जो मैं ढूंढ रहा हूं, लेकिन मैं अभी भी कई रिपीटिंग सेट करना चाहता हूं।

मुझे शायद इसे दो या दो से अधिक प्रश्नों में विभाजित करना चाहिए, लेकिन फिर मैं इस भयानक साइट को यहां बाढ़ नहीं देना चाहता।

पुनश्च: एक और सवाल है, संभवतः विषय बंद लेकिन: है यह in, inside, atया on the shell। और on the command lineसही है?

जवाबों:


8

यह वास्तव में दो प्रश्न हैं, और उन्हें विभाजित किया जाना चाहिए था। लेकिन चूंकि उत्तर अपेक्षाकृत सरल हैं, इसलिए मैं उन्हें यहां रखूंगा। ये उत्तर grepविशेष रूप से जीएनयू के लिए हैं ।

a) egrepजैसा है वैसा ही है grep -E। दोनों दर्शाते हैं कि "एक्सटेंडेड रेगुलर एक्सप्रेशंस" का इस्तेमाल grepडिफॉल्ट रेगुलर एक्सप्रेशंस के बजाय किया जाना चाहिए । grepसादे रेगुलर एक्सप्रेशन के लिए बैकस्लैश की आवश्यकता होती है।

से manपेज:

मूल बनाम विस्तारित नियमित अभिव्यक्तियाँ

बुनियादी नियमित अभिव्यक्तियों में मेटा-अक्षर ? , + , { , | , ( और ) अपना विशेष अर्थ खो देते हैं; इसके बजाय backslashed संस्करणों का उपयोग करें ? , \ + , \ { , \ | , \ ( , और \)

manऐतिहासिक सम्मेलनों और पोर्टेबिलिटी के बारे में अतिरिक्त विवरण के लिए पेज देखें ।

ख) आप माइनस एक (डॉट पहले मैच के बाद से) को बदलने की इच्छा रखने वाले पात्रों की संख्या का उपयोग करें egrep '(.)\1{N}'और बदलें N। इसलिए यदि आप चार बार दोहराए गए चरित्र का मिलान करना चाहते हैं, तो उपयोग करें egrep '(.)\1{3}'


मैन पेज को पढ़ते समय मुझे आपके द्वारा बताए गए भाग की वास्तव में गलत समझ या गलत व्याख्या करनी चाहिए। जब मैंने कुछ नियमित अभिव्यक्ति ट्यूटोरियल के माध्यम से काम किया, तो इस तरह के व्यवहार की कोई संभावना नहीं थी। मैंने सोचा था कि रेगुलर एक्सप्रेशन का मतलब इतने बुनियादी स्तर पर है कि ज्यादातर एप्लिकेशन समान प्रतीकों के साथ काम कर रहे हैं। फिर, मैं गलत साबित हुआ था। आपकी सहायताके लिए धन्यवाद! इससे वास्तव में मुझे मदद मिली।
इरच

यह पढ़ने में काफी भ्रामक है " हमेशा बैकस्लैश का उपयोग वर्णों जैसे कि, +, आदि से विशेष अर्थ लेने के लिए करें " और फिर यह पता लगाना कि विपरीत रूप से सबसे बुनियादी कमांड के साथ नियम है।
21

@ cellar.dweller यह भ्रामक है! बहुत सा तर्क ऐतिहासिक है। मैं विस्तारित रूप से अधिक परिचित हूं, इसलिए मुझे हमेशा उपयोग करने की आदत है egrepअगर मुझे नियमित अभिव्यक्ति की जरूरत है (जैसा कि सिर्फ साधारण स्ट्रिंग मिलान के विपरीत है) ताकि मुझे grepदोनों के बीच के अंतर को याद रखने की चिंता न हो। नियमित अभिव्यक्ति के प्रकार।
21

4
ध्यान दें कि मानक ERE बैक-रेफरेंस का समर्थन नहीं करते हैं, जबकि मानक BREs करते हैं। तो grep '\(.\)\1\{3\}'मानक है, grep -E '(.)\1{3}'नहीं है।
स्टीफन चेजलस 21

7

यह एक ही चरित्र के 2 या अधिक घटनाओं की तलाश करेगा:

grep -E '(.)\1+' file

यदि आपके awk के पास -o विकल्प है, तो यह प्रत्येक मैच को एक नई लाइन पर प्रिंट करेगा।

grep -Eo '(.)\1+' file

ठीक 3 मैचों के साथ मैच खोजने के लिए:

grep -E '(.)\1{2}' file

या 3 या अधिक:

grep -E '(.)\1{2,}' file

आदि..


संपादित करें

वास्तव में @stephane_chazelas बैक सन्दर्भ और -E के बारे में सही है। मैं उसके बारे में भूल गया था। मैंने इसे BSD grep और GNU grep में आज़माया और यह वहां काम करता है लेकिन यह कुछ अन्य greps में नहीं है। आपको नीचे दिए गए संस्करण में से एक का उपयोग करने की आवश्यकता होगी ..

नियमित grep संस्करण:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

-oविकल्प भी मानक ग्रेप BTW नहीं है (शायद अगर आपके ग्रेप समझता -ओ यह भी वापस संदर्भ कर सकते हैं) ..


नोट : grep -E '(.)\1{2,}'फ़ाइल और grep '\(.\)\1\{2\}'फ़ाइल गलत हैं जैसा कि एलेक्सिस ने संकेत दिया है और इसे अनदेखा किया जाना चाहिए।


धन्यवाद, अब तक। लेकिन: क्या मैं सही कह रहा हूं कि विकल्प के बिना ज्यादा कुछ नहीं होगा? -Egrepयह काफी कुछ समझाता है, उदाहरण के लिए कि मैं इतना समय बर्बाद क्यों कर रहा हूं जहां मैं गलत था!
21

-ई विकल्प के बिना आप इस मामले में भी ऐसा कर सकते हैं, लेकिन आपको अधिक भागने की आवश्यकता होगी और कोई +ऑपरेटर नहीं है .. मैं उदाहरण भी पोस्ट करूंगा।
स्क्रूटिनीजर

एक छोटा सुधार: grep -E '(.)\1{2}'"ठीक 3 मैचों के साथ मैच खोजें" बिल्कुल नहीं। हालांकि यह बिल्कुल तीन समान वर्णों से मेल खाएगा , वे एक लंबे दोहराया स्ट्रिंग में एम्बेड हो सकते हैं; उदाहरण के लिए, यह 5-प्रतीक स्ट्रिंग में मेल खाएगा AAAAA। (और अगर 6 या अधिक लगातार प्रतीक हैं, तो यह एक से अधिक बार मेल खाएगा)।
एलेक्सिस

जी हाँ आप बिलकुल सही कह रहे हैं, कि यह उद्देश्य के अनुसार काम नहीं करता है, वास्तव में ऐसा संभव नहीं है ..
स्क्रूटिनीज़र

3

सबसे पहले, आपकी समर्थन टिप्पणियों और सुझावों के लिए आप सभी का धन्यवाद। जैसा कि यह पता चला है कि मैं पहले से ही जवाब के काफी करीब था।

मुख्य मुद्दा के बारे में था:

वहाँ एक ही चरित्र की n घटनाओं को देखने के लिए एक आसान तरीका है , उदाहरण के लिए aa,tttttt

संक्षिप्त उत्तर :

निम्न [आदेश] की विविधताएं aकम से कम एक और अनंत बार दोहराएंगी

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

या, GNU रेगुलर एक्सप्रेशन के साथ उपलब्ध है grep a\+


दोहराने की संख्या पैटर्न के माध्यम से घुंघराले कोष्ठक के अंदर सेट की जाती है {min,max}{n}ठीक nसमय {n,}पर दोहराएं, कम से कम nबार {n,m}दोहराएं और कम से कम nलेकिन अधिकांश mसमय दोहराएं ।

इस प्रकार, परिणामस्वरूप, द्वितीयक मुद्दा उठाया :

क्या मेरे द्वारा उपयोग की जाने वाली कमांड के लिए बैकलैश सेट करने की आवश्यकता है?

संक्षिप्त उत्तर : हां, बैकस्लैश का उपयोग इस बात पर निर्भर करता है कि कोई उपयोग करता है grepया नहींegrep

  • grep: बैकस्लैश मेटाचैटर्स को सक्रिय करता है [बेसिक रेगुलर एक्सप्रेशंस का उपयोग करता है]
  • egrepबैकस्लैश डी -activates अक्षरों से परे [का उपयोग करता है रेगुलर एक्सप्रेशन विस्तारित]

जैसा कि यह संक्षिप्त उत्तर है, मैं उन लोगों को प्रदान करना चाहता हूं जो तुलनीय मुद्दों में भाग लेते हैं, मैंने अपने मूल सारांश को जोड़ा है जिसमें से किसी को भी मालूम होना चाहिए, साथ काम करना grepऔर egrep




बेसिक, एक्सटेंडेड और जीएनयू रेगुलर एक्सप्रेशंस

बुनियादी नियमित अभिव्यक्तियाँ

में प्रयुक्त grep, edऔर sedआज्ञा

बेसिक रेगुलर एक्सप्रेशंस सेट की विशेषताएं हैं:

  • अधिकांश मेटाचैकर, उदाहरण ? [ . \ )आदि को बैकस्लैश के माध्यम से सक्रिय किया जाता है। यदि कोई बैकस्लैश नहीं है, तो उन्हें खोज शब्द के भाग के रूप में लिया जाएगा।
  • ^ $ \<और \>बैकस्लैश के बिना समर्थित हैं
  • कोई आशुलिपि वर्ण [ \b, \sआदि]

जीएनयू बेसिक रेगुलर एक्सप्रेशन इन में जोड़ते हैं

  • \?चरित्र शून्य या एक समय ( c\?मैचों cऔर cc) को दोहराएं और इसके लिए एक विकल्प है\{0,1\}
  • \+एक चरित्र को कम से कम एक बार ( c\+मैचों cc, ccccccccआदि) को दोहराएं और इसके लिए एक विकल्प है\{1,\}

  • \|समर्थित है (जैसे grep a\|bकी तलाश करेगा aयाb

grep -E विस्तारित नियमित एक्सप्रेशन के पूरे सेट का उपयोग करने के लिए कमांड को सक्षम करता है:


विस्तारित नियमित एक्सप्रेशन [ERE]

में प्रयोग किया जाता है egrep, awkऔर emacsकुछ सुविधाओं के साथ बेसिक सेट प्लस है।

  • मेटाचक्रर्स को बैकस्लैश के माध्यम से निष्क्रिय किया जाता है
  • कोई संदर्भ नहीं
  • और: बहुत सारे जादू रेगुलर एक्सप्रेशन आम तौर पर एक के लिए कर सकते हैं

GNU विस्तारक नियमित एक्सप्रेशन

निम्नलिखित विशेषताएं जोड़ता है

दो लिंक नियमित-expressions.info को एक को निर्देशित करेंगे, जो कि मुझे यहां मिले awsome समर्थन के अलावा, वास्तव में मुझे बहुत मदद मिली है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.