उदाहरण के लिए "Conclusion" में दो c हैं लेकिन अलग-अलग इंडेक्स पर हैं। मैं उपयोग कर रहा हूँ

egrep -i 'c{2}' input.file

यह मुझे केवल "स्वीकार करें" की तरह दिखाता है। मेरा मतलब है कि यह मुझे दिखाता है कि केवल ये शब्द कंधे से कंधा मिलाकर हैं लेकिन मैं यहां "निष्कर्ष" भी देखना चाहता हूं

1
Developer Cindy 3 अप्रैल 2021, 15:47

3 जवाब

सबसे बढ़िया उत्तर

यदि आप उन पंक्तियों का मिलान करने की योजना बना रहे हैं जिनमें कोई भी दो समान अक्षर हैं जो आवश्यक रूप से क्रमागत नहीं हैं, तो आप उपयोग कर सकते हैं

grep -i '\([[:alpha:]]\).*\1'

यहां, \([[:alpha:]]\) आईडी 1 वाला एक कैप्चरिंग ग्रुप है जो किसी भी अक्षर से मेल खाता है, .* किसी भी टेक्स्ट से मेल खाता है और फिर \ 1 बैकरेफरेंस उसी वर्ण से मेल खाता है जो समूह 1 में है (केस असंवेदनशील रूप से -i विकल्प के कारण)।

यदि आपके मन में अपनी पसंद का कोई विशिष्ट अक्षर है, तो आप एक सरल का उपयोग कर सकते हैं

grep -i 'c.*c'

तो, बस POSIX वर्ण वर्ग और बैकरेफर को अक्षर से बदलें।

यदि आप यह सुनिश्चित करना चाहते हैं कि केवल दो समान अक्षर हैं और अधिक नहीं, तो आप इसका उपयोग कर सकते हैं

grep -iP '^(?!.*(\p{L})(?:.*\1){2}).*(\p{L}).*\2'

पीसीआरई पैटर्न का विवरण (P विकल्प पर ध्यान दें):

  • ^ - स्ट्रिंग की शुरुआत
  • (?!.*(\p{L})(?:.*\1){2}) - एक नकारात्मक लुकहेड जो मैच को विफल कर देता है यदि लाइन ब्रेक वर्णों के अलावा शून्य या अधिक वर्ण हैं, तो जितना संभव हो सके, फिर कोई यूनिकोड अक्षर (समूह 1 में कैप्चर किया गया, और फिर किसी भी शून्य या अधिक की दो घटनाएं लाइन ब्रेक वर्णों के अलावा अन्य वर्ण, जितना संभव हो, उसी पत्र के साथ समूह 1 में कब्जा कर लिया गया
  • .* - लाइन ब्रेक वर्णों के अलावा शून्य या अधिक वर्ण, यथासंभव अधिक
  • (\p{L}) - समूह 2: कोई यूनिकोड अक्षर
  • .* - लाइन ब्रेक वर्णों के अलावा शून्य या अधिक वर्ण, यथासंभव अधिक
  • \2 - समूह 2 मान का बैकरेफरेंस।

और यदि चरित्र एक विशिष्ट है:

grep -i '^[^c]*c[^c]*c[^c]*$' <<< "$s"

जहां [^c]* c के अलावा शून्य या अधिक वर्णों से मेल खाता है।

grep डेमो देखें:

#!/bin/bash
s='Conclusion
cold
Collaccio'
grep -i '\([[:alpha:]]\).*\1' <<< "$s"
# => Conclusion
#    Collaccio
grep -iP '^(?!.*(\p{L})(?:.*\1){2}).*(\p{L}).*\2' <<< "$s"
# => Conclusion
grep -i 'c.*c' <<< "$s"
# => Conclusion
#    Collaccio
grep -i '^[^c]*c[^c]*c[^c]*$' <<< "$s"
# => Conclusion
0
Wiktor Stribiżew 3 अप्रैल 2021, 18:19

आप gnu grep के -P (PCRE) विकल्प का उपयोग करके ऐसा कर सकते हैं:

grep -iP '(c).*\1' <<< 'Conclusion'
Conclusion

grep -iP '(c).*\1' <<< 'Accept'
Accept

यहां हम कैप्चर ग्रुप नंबर 1 में c का मिलान और समूह करते हैं और फिर \1 का उपयोग करके सुनिश्चित करते हैं कि वही वर्ण फिर से मेल खाता है।

0
anubhava 3 अप्रैल 2021, 16:04
grep -i '\(.*c\)\{2\}' file.in

संदर्भ : https: //unix.stackexchange.com/questions/530697/how-to-search-for-strings-that-occur-more-than-once-in-a-line

मेरा नमूना file.in

Conclusion
Accept
Much
Chair

नतीजा

Conclusion
Accept
0
irnerd 3 अप्रैल 2021, 16:07