गैर-वर्णानुक्रमिक तारों से '[az] * क्यों मेल खाता है?


9

मेरे पास alphanumइन दो लाइनों के साथ एक फाइल है :

123 abc
this is a line

मैं उलझन में हूं कि क्यों, जब मैं दौड़ता हूं, तो मुझे sed 's/[a-z]*/SUB/' alphanumनिम्न आउटपुट मिलते हैं:

SUB123 abc
SUB is a line

मैं उम्मीद कर रहा था:

123 SUB
SUB is a line

मुझे एक फ़िक्स मिला ( sed 's/[a-z][a-z]*/SUB/'इसके बजाय उपयोग करें ), लेकिन मुझे समझ नहीं आया कि यह क्यों काम करता है और मेरा नहीं है।

क्या आप मदद कर सकते हैं?



@ कामराज, कि एक समान है, लेकिन शेल पैटर्न बनाम शीर्ष पर भ्रम की स्थिति है (और उत्तर पूर्व पर ध्यान केंद्रित करते हैं, क्योंकि यही ls foo*उपयोग है)। लेकिन वैसे भी, यदि आपको ऐसे प्रश्न मिलते हैं जो डुप्लिकेट हैं, तो मुझे लगता है कि आपको उन्हें इस तरह से भी ध्वजांकित करने में सक्षम होना चाहिए।
इलकाचू २०'१ach

बाहर की जाँच regexr.com लाइव दृश्यों के लिए और बताते हैं
RozzA

@RozzA ध्यान दें कि आप जिस वेबसाइट को जावास्क्रिप्ट और पर्ल रेगुलर एक्सप्रेशन का समर्थन करने के लिए लिंक करते हैं, न कि पॉसिक्स रेगुलर एक्सप्रेशन।
Kusalananda

जवाबों:


28

पैटर्न [a-z]*से मेल खाता शून्य रेंज में या अधिक वर्ण aके लिए z( वास्तविक पात्रों वर्तमान स्थान पर निर्भर हैं)। स्ट्रिंग 123 abc(यानी पैटर्न मैच) के बहुत शुरुआत में शून्य ऐसे पात्र हैं , और उनमें से चार भी शुरू में this is a line

यदि आपको कम से कम एक मैच की आवश्यकता है , तो उपयोग करें और [a-z][a-z]*या उसके [a-z]\{1,\}साथ विस्तारित नियमित अभिव्यक्ति को सक्षम करें या sed -Eउपयोग करें [a-z]+

यह देखने के लिए कि पैटर्न का मिलान कहां होता है, प्रत्येक मैच के चारों ओर कोष्ठक जोड़ें:

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

या, लाइनों पर सभी मैच देखने के लिए:

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

उस अंतिम परिणाम की तुलना करें

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)

7
तकनीकी रूप से कोलिंग तत्वों से[a-z] मेल खाता है जो एक से अधिक वर्णों से बना हो सकता है। उदाहरण के लिए, कुछ हंगरी स्थानों में, [a-z]पर से मेल खाता हैdzs
स्टीफन Chazelas

12

क्योंकि पिछले परमाणु के शून्य या अधिक दोहराव से *मेल खाता है , और सभी रेगेक्स इंजन पहले मैच को खोजने की कोशिश करते हैं। आपके स्ट्रिंग की शुरुआत में बिल्कुल शून्य अक्षरों का एक विकल्प है, इसलिए यह वह जगह है जहां यह मेल खाता है। मामले में जहां स्ट्रिंग एक पत्र से शुरू होती है, *मैच जितने हो सकते हैं, लेकिन यह सबसे बाएं मैच को खोजने के लिए माध्यमिक है।

शून्य-लंबाई के मैच थोड़ा समस्याग्रस्त हो सकते हैं, और जैसा कि आपने देखा, समाधान पैटर्न को संशोधित करना है ताकि इसे कम से कम एक वर्ण की आवश्यकता हो। विस्तारित रेगेक्स के साथ, आप उस के +लिए कर सकते हैं :sed -E 's/[a-z]+/SUB/'

मनोरंजन के लिए, कोशिश करें:

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.