[Az] तारांकन संख्याओं का मिलान क्यों होता है?


13

वर्तमान पथ पर मेरी 3 निर्देशिकाएं हैं।

$ls
a_0db_data  a_clean_0db_data  a_clean_data
$ls a_*_data
a_0db_data:

a_clean_0db_data:

a_clean_data:

$ls a_[a-z]*_data
a_clean_0db_data:

a_clean_data:

मुझे उम्मीद थी कि अंतिम एलएस कमांड केवल मैच के लिए होगा a_clean_data। यह भी युक्त युक्त से मेल क्यों खाता है 0?

bash --version
GNU bash, version 4.2.24(1)-release (i686-pc-linux-gnu)

2
एक नियमित अभिव्यक्ति और एक ग्लोब के बीच अंतर पर अधिक के लिए इस प्रश्न को देखें ।
terdon

4
तो इस तथ्य से a_*_dataमेल खाता है कि आपमें से किसी ने भी आपको आश्चर्यचकित नहीं किया है?
Cululhu

@Cululhu तुम मुझे मिल गया!
user13107

जवाबों:


29

[a-z]भाग क्या नंबर से मेल खाता नहीं है, यह है *। आप शेल ग्लोबिंग और नियमित अभिव्यक्ति को भ्रमित कर सकते हैं ।

उपकरण की तरह grep(regexes के विभिन्न जायके को स्वीकार बुनियादी डिफ़ॉल्ट रूप से, -Eविस्तारित के लिए, -Pके लिए पर्ल regex )

ईजी ( -vमैच में प्रवेश करता है)

$ ls a_[a-z]*_data | grep -v "[0-9]"
a_clean_data

यदि आप एक bash regex का उपयोग करना चाहते हैं, तो यहां एक उदाहरण है कि कैसे परीक्षण किया जाए कि चर $refएक पूर्णांक है:

re='^[0-9]+$'
if ! [[ $ref =~ $re ]] ; then
  echo "error"
fi

फिर बैश रेगेक्स का उपयोग कैसे करें? (देखें tldp.org/LDP/Bash-Beginners-Guide/html/sect_04_01.html )
user13107


21

तो समस्या यह है: a_[a-z]*_dataमैच क्यों होता है a_clean_0db_data?

इसे चार भागों में विभाजित किया जा सकता है :

  • a_की शुरुआत से मेल खाता है a_clean_0db_data, छोड़ने के clean_0db_dataमिलान किया जा

  • [a-z]सीमा में किसी भी वर्ण से मेल खाता है a-z(उदाहरण के लिए c), lean_0db_dataमिलान किया जा रहा है

  • * किसी भी वर्ण से मेल खाता है, जैसे lean_0db

  • _data अनुगामी से मेल खाता है _data

नियमित अभिव्यक्तियों में, [a-z]*का अर्थ होगा किसी भी संख्या के अक्षर (शून्य सहित) az की श्रेणी में , लेकिन आप शेल ग्लोबिंग के साथ काम कर रहे हैं, न कि नियमित अभिव्यक्तियों के साथ।

यदि आप नियमित भाव चाहते हैं, findतो कुछ कार्यान्वयनों के लिए एक -regexविधेय है:

find . -maxdepth 1 -regex "^.*/a_[a-z]*_data$"

आपके -maxdepthद्वारा अपने फ़ोल्डर में खोज-परिणामों को सीमित करने के लिए केवल यहाँ है। नियमित अभिव्यक्ति पूरे फ़ाइलनाम से मेल खाती है , इसलिए मैंने ^.*/पथ-भाग से मिलान करने के लिए एक जोड़ दिया है


11

*शेल पैटर्न में 0 या अधिक वर्णों से मेल खाता है। यह *नियमित अभिव्यक्ति ऑपरेटर के साथ भ्रमित नहीं होना है जिसका अर्थ है 0 या उससे अधिक पूर्ववर्ती परमाणु

*मूल शेल पैटर्न में रेगेक्सपी के बराबर नहीं है । हालाँकि, विभिन्न गोले उसके लिए एक्सटेंशन हैं।

  • kshहै *(something):

    ls a_*([a-z])_data
  • आप के bashसाथ shopt -s extglobया zshसाथ में एक ही हो सकता है setopt kshglob:

    shopt -s extglob
    ls a_*([a-z])_data
  • में zshसाथ extendedglobसक्रिय है, #regexp के बराबर है *:

    setopt extendedglob
    ls a_[a-z]#_data
  • के हाल के संस्करणों में ksh93, आप ग्लोब में नियमित अभिव्यक्ति का भी उपयोग कर सकते हैं। यहां विस्तारित नियमित अभिव्यक्तियों के साथ:

    ls ~(E:a_[a-z]*_data)

ध्यान दें कि [a-z]वर्तमान स्थान के आधार पर विभिन्न चीजों से मेल खाता है। यह आमतौर पर लोकेल में केवल 26 aसे zलैटिन गैर-उच्चारण अक्षरों से मेल खाता है C। अन्य स्थानों में, यह आम तौर पर अधिक मेल खाता है, और हमेशा समझ में नहीं आता है। अपने स्थान में एक पत्र से मेल खाने के लिए, आप पसंद कर सकते हैं [[:alpha:]]


क्या आप [a-z]अधिक मिलान का एक उदाहरण दे सकते हैं कि 26 अंक सी लोकेल में मेल खाते हैं? जब मुझे पिछली बार इस पर ध्यान दिया गया था, तो मुझे याद है कि यूनिक्स वेरिएंट में व्यावहारिक रूप से उपयोग किए जाने वाले सभी एनकोडिंगों में एक आधार के रूप में ISO-646 था (तब ऊपरी 128 कोड जहां अलग-अलग उपयोग किए जाते थे, सीधे ISO-8859-X जैसे एन्कोडिंग में वर्णों के लिए, में संयुक्त UTF-8 या EUC परिवार जैसे एनकोडिंग)। यहां तक ​​कि AIX में EBCDIC स्थान नहीं थे (कम से कम मेरे लिए उपलब्ध)। मुझे याद है कि अगर POSIX / UNIX मानकों ने यह मांग करने की कोशिश की, लेकिन मुझे इसका परिणाम याद नहीं है।
एपीग्रामग्राम

1
@AProgrammer, यह एन्कोडिंग से स्वतंत्र है, यह सॉर्ट क्रम (LC_COLLATE) पर आधारित है। [a-z]आम तौर पर उन स्थानों में éया í(लेकिन जरूरी नहीं ź) उन स्थानों में शामिल हैं जहां चारसेट उनके पास है, चाहे उस एन्कोडिंग में कोडपॉइंट एक और जेड के बीच है या नहीं। केवल सी लोकेल कोडपॉइंट वैल्यू के आधार पर एक सॉर्ट ऑर्डर की गारंटी देता है। देखें इस दूसरे जवाब अधिक जानकारी के लिए।
स्टीफन चेजलस

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