Bash
पैटर्न मिलान और नियमित अभिव्यक्ति
खोज…
वाक्य - विन्यास
- $ shopt -u विकल्प # बैश के अंतर्निहित 'विकल्प को निष्क्रिय करें'
- $ shops -s विकल्प # बैश के अंतर्निहित 'विकल्प' को सक्रिय करें
टिप्पणियों
चरित्र वर्ग
[]
ग्लोब के लिए वैध चरित्र कक्षाएं पोसिक्स मानक द्वारा परिभाषित की जाती हैं:
alnum अल्फ़ा ascii ब्लैंक cntrl डिजिट ग्राफ लोअर प्रिंट पंच स्पेस अपर वर्ड xdigit
अंदर []
एक से अधिक वर्ण वर्ग या श्रेणी का उपयोग किया जा सकता है, जैसे,
$ echo a[a-z[:blank:]0-9]*
किसी भी फ़ाइल से मेल खाती है जो a
शुरू होती a
और उसके बाद एक लोअरकेस अक्षर या एक रिक्त या एक अंक होता है।
यह ध्यान में रखा जाना चाहिए, हालांकि, कि एक []
ग्लोब को केवल पूरी तरह से नकारा जा सकता है और न केवल इसके कुछ हिस्सों को। Negating चरित्र उद्घाटन के बाद पहले चरित्र होना चाहिए [
, जैसे, इस अभिव्यक्ति सभी फ़ाइलें एक साथ शुरू नहीं है से मेल खाता है a
$ echo [^a]*
निम्नलिखित उन सभी फाइलों से मेल खाता है जो किसी अंक या ^
$ echo [[:alpha:]^a]*
यह किसी भी फ़ाइल से मेल नहीं खाता है या एक को छोड़कर पत्र के साथ साथ कि शुरू होता है फ़ोल्डर a
क्योंकि ^
एक शाब्दिक रूप में व्याख्या की है ^
।
गोलाकार पात्रों से बचना
यह संभव है कि किसी फ़ाइल या फ़ोल्डर में उसके नाम के भाग के रूप में एक ग्लोब कैरेक्टर हो। इस मामले में एक शाब्दिक एक शाब्दिक मैच के लिए पूर्ववर्ती \
_ के साथ बच सकता है। एक अन्य दृष्टिकोण फ़ाइल को संबोधित करने के लिए दोहरे ""
या एकल ''
उद्धरणों का उपयोग करना है। बैश ग्लब्स को संसाधित नहीं करता है जो ""
या ''
भीतर संलग्न हैं।
नियमित भावों में अंतर
ग्लब्स और रेग्युलर एक्सप्रेशंस के बीच सबसे महत्वपूर्ण अंतर यह है कि एक वैध रेगुलर एक्सप्रेशंस को क्वालीफायर के साथ-साथ क्वांटिफायर की भी आवश्यकता होती है। एक क्वालीफायर यह पहचानता है कि क्या मिलान करना है और एक क्वांटिफायर बताता है कि क्वालीफायर से कितनी बार मिलान करना है। समतुल्य RegEx को *
glob .*
कहाँ है .
किसी भी चरित्र के लिए खड़ा है और *
पिछले चरित्र के शून्य या अधिक मैचों के लिए खड़ा है। के लिए बराबर RegEx ?
ग्लोब है .{1}
पहले की तरह, क्वालीफायर .
किसी भी वर्ण से मेल खाता है और {1}
ठीक एक बार पूर्ववर्ती क्वालीफायर से मेल खाता है। इस के साथ भ्रमित नहीं होना चाहिए ?
क्वांटिफायर, जो एक रेग्युलर में शून्य या एक बार मेल खाता है। []
ग्लोब का उपयोग केवल एक RegEx में ही किया जा सकता है, जब तक कि यह एक अनिवार्य क्वांटिफायर द्वारा पीछा किया जाता है।
समतुल्य नियमित अभिव्यक्ति
ग्लोब | रेगुलर एक्सप्रेशन से |
---|---|
* | .* |
? | . |
[] | [] |
जांचें कि क्या एक स्ट्रिंग एक नियमित अभिव्यक्ति से मेल खाती है
जांचें कि क्या एक स्ट्रिंग में ठीक 8 अंक हैं:
$ date=20150624
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
yes
$ date=hello
$ [[ $date =~ ^[0-9]{8}$ ]] && echo "yes" || echo "no"
no
* ग्लोब
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
तारांकन * संभवतः सबसे अधिक इस्तेमाल किया जाने वाला ग्लोब है। यह बस किसी भी स्ट्रिंग से मेल खाता है
$ echo *acy
macy stacy tracy
एक * * उन फ़ाइलों और फ़ोल्डरों से मेल नहीं खाएगा जो सबफ़ोल्डर्स में रहते हैं
$ echo *
emptyfolder folder macy stacy tracy
$ echo folder/*
folder/anotherfolder folder/subfolder
द ** ग्लोब
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -s globstar
बैश एक ही ग्लोब के रूप में दो आसन्न क्षुद्रग्रहों की व्याख्या करने में सक्षम है। globstar
विकल्प सक्रिय होने के साथ इसका उपयोग उन फ़ोल्डरों से मिलान करने के लिए किया जा सकता है जो निर्देशिका संरचना में गहरे रहते हैं
echo **
emptyfolder folder folder/anotherfolder folder/anotherfolder/content folder/anotherfolder/content/deepfolder folder/anotherfolder/content/deepfolder/file folder/subfolder folder/subfolder/content folder/subfolder/content/deepfolder folder/subfolder/content/deepfolder/file macy stacy tracy
**
एक पथ विस्तार के बारे में सोचा जा सकता है, चाहे वह मार्ग कितना ही गहरा क्यों न हो। यह उदाहरण किसी भी फ़ाइल या फ़ोल्डर से मेल खाता है जो deep
शुरू होता है, भले ही यह कितना भी गहरा क्यों न हो:
$ echo **/deep*
folder/anotherfolder/content/deepfolder folder/subfolder/content/deepfolder
? ग्लोब
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
?
बस एक चरित्र से मेल खाता है
$ echo ?acy
macy
$ echo ??acy
stacy tracy
[] ग्लोब
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
यदि विशिष्ट वर्णों का मिलान करना है तो '[]' का उपयोग किया जा सकता है। '[]' के अंदर किसी भी वर्ण को एक बार ठीक से मिलान किया जाएगा।
$ echo [m]acy
macy
$ echo [st][tr]acy
stacy tracy
[]
, ग्लोब, हालांकि, उससे कहीं अधिक बहुमुखी है। यह एक नकारात्मक मैच और यहां तक कि वर्णों और सीमर्स्कलासेस की मिलान श्रृंखलाओं के लिए भी अनुमति देता है। एक नकारात्मक मैच का उपयोग करके प्राप्त किया जाता है !
या ^
पहले चरित्र के रूप में निम्नलिखित [
। हम stacy
मिलान कर सकते हैं
$ echo [!t][^r]acy
stacy
यहां हम बता रहे हैं कि हम केवल उन फाइलों का मिलान करना चाहते हैं जो एक t
शुरू नहीं होती हैं और दूसरा अक्षर r
नहीं है और फाइल acy
में समाप्त होती है।
एक हाइफ़न ( -
) के साथ वर्णों की एक जोड़ी को अलग करके रंगों का मिलान किया जा सकता है। कोई भी चरित्र जो उन दो संलग्न पात्रों के बीच आता है - समावेशी - का मिलान किया जाएगा। जैसे, [rt]
[rst]
बराबर है
$ echo [r-t][r-t]acy
stacy tracy
वर्ण वर्गों का मिलान [:class:]
द्वारा किया जा सकता है, उदाहरण के लिए, व्हाट्सएप युक्त फ़ाइलों का मिलान करने के लिए
$ echo *[[:blank:]]*
file with space
छिपी हुई फाइलों का मिलान करना
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
बाश बिल्ट-इन ऑप्शन डॉटग्लोब छिपी हुई फ़ाइलों और फ़ोल्डरों, अर्थात, फ़ाइलों और फ़ोल्डरों से मेल खाने की अनुमति देता है, जो एक के साथ शुरू होता है .
$ shopt -s dotglob
$ echo *
file with space folder .hiddenfile macy stacy tracy
केस असंवेदनशील मिलान
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
विकल्प सेट करना nocaseglob
ग्लोब को केस असंवेदनशील तरीके से मैच करेगा
$ echo M*
M*
$ shopt -s nocaseglob
$ echo M*
macy
व्यवहार जब एक ग्लोब कुछ भी मेल नहीं खाता है
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
मामले में ग्लोब कुछ भी मेल नहीं खाता है, परिणाम विकल्प nullglob
और failglob
द्वारा निर्धारित किया failglob
। यदि उनमें से कोई भी सेट नहीं है, तो बैश ग्लोब को वापस कर देगा यदि कुछ भी मिलान नहीं किया गया है
$ echo no*match
no*match
यदि nullglob
सक्रिय है तो कुछ भी नहीं ( null
) लौटाया जाता है:
$ shopt -s nullglob
$ echo no*match
$
यदि failglob
सक्रिय है, तो एक त्रुटि संदेश वापस आ जाता है:
$ shopt -s failglob
$ echo no*match
bash: no match: no*match
$
ध्यान दें, कि failglob
ऑप्शन failglob
ऑप्शन को nullglob
है, यानी, अगर nullglob
और failglob
दोनों सेट होते हैं, तो - कोई मैच नहीं होने की स्थिति में - एक त्रुटि वापस आ जाती है।
विस्तारित ग्लोबिंग
तैयारी
$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar
बैश का बिल्ट-इन extglob
विकल्प एक ग्लोब की मिलान क्षमताओं का विस्तार कर सकता है
shopt -s extglob
निम्नलिखित उप-पैटर्न में मान्य विस्तारित ग्लोब शामिल हैं:
-
?(pattern-list)
- दिए गए पैटर्न के शून्य या एक घटना से मेल खाता है -
*(pattern-list)
- दिए गए पैटर्न के शून्य या अधिक घटनाओं से मेल खाता है -
+(pattern-list)
- दिए गए पैटर्न की एक या अधिक घटनाओं से मेल खाता है -
@(pattern-list)
- दिए गए पैटर्न में से एक से मेल खाता है -
!(pattern-list)
- दिए गए पैटर्न में से एक को छोड़कर किसी भी चीज से मेल खाता है
pattern-list
से अलग कर दिया globs की एक सूची है |
।
$ echo *([r-t])acy
stacy tracy
$ echo *([r-t]|m)acy
macy stacy tracy
$ echo ?([a-z])acy
macy
pattern-list
ही एक और, नेस्टेड विस्तारित ग्लोब हो सकती है। उपरोक्त उदाहरण में हमने देखा है कि हम tracy
और stacy
मिलान *(rt)
। इस विस्तारित ग्लोब का उपयोग नकारात्मकता वाले विस्तारित ग्लोब के अंदर ही किया जा सकता है !(pattern-list)
macy
से मिलान करने के लिए
$ echo !(*([r-t]))acy
macy
यह ऐसी किसी भी चीज़ से मेल खाता है जो अक्षरों r
, s
और t
शून्य या अधिक घटनाओं के साथ शुरू नहीं होता t
, जो केवल macy
को संभावित मैच के रूप में छोड़ देता है।
रेगेक्स मिलान
pat='[^0-9]+([0-9]+)'
s='I am a string with some digits 1024'
[[ $s =~ $pat ]] # $pat must be unquoted
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
आउटपुट:
I am a string with some digits 1024
1024
रेगेक्स को एक चर ( $pat
) में रखने के बजाय हम भी कर सकते हैं:
[[ $s =~ [^0-9]+([0-9]+) ]]
व्याख्या
-
[[ $s =~ $pat ]]
निर्माण रेगेक्स मिलान करता है - कैप्चर किए गए समूह यानी मैच परिणाम BASH_REMATCH नामक सरणी में उपलब्ध हैं
- BASH_REMATCH सरणी में 0 वां सूचकांक कुल मिलान है
- BASH_REMATCH सरणी में i'th इंडेक्स i'th कैप्चर किया गया समूह है, जहाँ मैं = 1, 2, 3 ...
एक स्ट्रिंग के खिलाफ एक रेगेक्स मैच से पकड़े गए समूह प्राप्त करें
a='I am a simple string with digits 1234'
pat='(.*) ([0-9]+)'
[[ "$a" =~ $pat ]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"
echo "${BASH_REMATCH[2]}"
आउटपुट:
I am a simple string with digits 1234
I am a simple string with digits
1234