Grep का उपयोग करके वर्णों की निश्चित संख्या के साथ मिलान स्ट्रिंग


9

मैं सभी 6अक्षर शब्दों का उपयोग करने की कोशिश कर रहा हूं grep। वर्तमान में मेरे पास यह है:

grep "^.\{6\}$" myfile.txt 

हालाँकि, मुझे लग रहा है कि मुझे भी परिणाम मिल रहे हैं जैसे: étuis, étude

मुझे संदेह है कि इसका eउपरोक्त शब्दों के ऊपर प्रतीकों के साथ कुछ है ।

क्या ऐसा कुछ है जो मैं यह सुनिश्चित करने के लिए कर सकता हूं कि ऐसा न हो?

आपकी सहायताके लिए धन्यवाद!

जवाबों:


4

grepएक चरित्र का विचार स्थानीय-निर्भर है । यदि आप एक गैर-यूनिकोड स्थान में हैं और आप इसमें यूनिकोड वर्णों वाली फ़ाइल से grep हैं तो वर्ण गणना मेल नहीं खाएगी। यदि आप echo $LANGतो आप जिस लोकेल में हैं उसे देखेंगे।

यदि आप ".UTF-8" के साथ समाप्त होने वाले मान LC_CTYPEऔर / या LANGपर्यावरण चर को सेट करते हैं तो आपको सही व्यवहार मिलेगा:

$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$

आप कमांड के रूप में उसी लाइन पर वेरिएबल असाइन करके केवल एक कमांड के लिए अपना लोकल बदल सकते हैं।

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


ध्यान दें कि यह अभी भी चीजों को तोड़ने के लिए संभव है, या कम से कम ठीक वैसा ही न करें जो आप उम्मीद करते हैं, पात्रों के संयोजन की उपस्थिति में । आप grepलेटीन स्माल लेटरर ई + कॉम्बिनेटर चार्ज ACUTE ABUTE के साथ LATIN SMALL LETTER E की तुलना में अलग तरीके से व्यवहार कर सकते हैं।


यदि आप उपयोग करते हैं ., तो कुछ ऐसा wăsd'sमेल खाएगा
cuonglm

'एक ऐसा चरित्र है जो यथोचित "वर्णों की एक निश्चित संख्या के साथ स्ट्रिंग" का हिस्सा हो सकता है।
माइकल होमर

शायद। और आपको दोनों को सेट करना चाहिए LC_CTYPEऔर LANG, ऐसा कुछ LC_CTYPE=en_US.UTF-8 LANG=en_USविफल हो जाएगा। LC_ALLसुरक्षा के लिए उपयोग करें ।
congonglm

2

इसे इस्तेमाल करे:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-xपूरी लाइन से मेल खाने के लिए, और POSIX द्वारा परिभाषित ( grep देखें )।

क्या करता है की अच्छी व्याख्या के लिए यहाँ देखें LC_ALL। आप समान व्यवहार प्राप्त करने के लिए utf-8 का उपयोग LANGया सेट कर सकते LC_CTYPEहैं। प्रभावित करने वाला क्रम LC_ALL=> LANG=> है LC_CTYPE


2

ग्नू के साथ grepजब पीसीआरई समर्थन के साथ बनाया गया है, तो आप कर सकते हैं:

grep -Px '\X{6}'

जबकि .एक चरित्र से मेल खाता है, \Xएक विचारधारा / अंगूर से मेल खाता है।

UTF-8 लोकेल में:

$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études

उस उत्तरार्द्ध में études, 7 वर्ण, 8 बाइट्स और 6 ग्रैफ़ेम्स हैं।


ऐसा लगता है कि काम नहीं करता है: echo épée | grep -Px '\X{6}'ouputépée
cuonglm

@Gnouc, आपको एक UTF-8 लोकेल में चलाने की आवश्यकता है (यदि éऊपर वाले को UTF-8 में एन्कोड किया गया था)।
स्टीफन चेजालस

ओह, मेरी गलतियाँ। यह UTF-8 के साथ काम करता है।
congonglm

0

आप कुछ इस तरह की कोशिश कर सकते हैं:

grep "^[A-Za-z]\{6\}$" myfile.txt

या यदि शब्दों में संख्याएँ भी हो सकती हैं, तो:

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

बस वर्ग कोष्ठक में कोई भी वर्ण जोड़ें जो आप इसके अतिरिक्त चाहते हैं।


यह बिलकुल भी मेल नहीं खाएगा étude, क्योंकि एक्सेंट के अनुरूप ASCII वर्ण रेगेक्स को गड़बड़ कर देगा।
एलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.