यदि आप बैश का उपयोग कर रहे हैं, तो आपको उपयोग करने की आवश्यकता नहीं है grep
:
files="*.jpg"
regex="[0-9]+_([a-z]+)_[0-9a-z]*"
for f in $files # unquoted in order to allow the glob to expand
do
if [[ $f =~ $regex ]]
then
name="${BASH_REMATCH[1]}"
echo "${name}.jpg" # concatenate strings
name="${name}.jpg" # same thing stored in a variable
else
echo "$f doesn't match" >&2 # this could get noisy if there are a lot of non-matching files
fi
done
रेगेक्स को एक चर में रखना बेहतर है। कुछ पैटर्न काम नहीं करेगा अगर शाब्दिक रूप से शामिल किया गया हो।
यह उपयोग करता है =~
बैश के रेगेक्स मैच ऑपरेटर का है। मैच के परिणाम नामक एक सरणी में सहेजे जाते हैं $BASH_REMATCH
। पहला कैप्चर ग्रुप इंडेक्स 1, दूसरा (यदि कोई हो) को इंडेक्स 2 में रखा गया है, तो इंडेक्स शून्य पूरा मैच है।
आपको पता होना चाहिए कि एंकर के बिना, यह रेगेक्स (और उपयोग करने वाला grep
) निम्नलिखित उदाहरणों में से किसी एक और अधिक से मेल खाएगा, जो कि वह नहीं है जो आप खोज रहे हैं:
123_abc_d4e5
xyz123_abc_d4e5
123_abc_d4e5.xyz
xyz123_abc_d4e5.xyz
दूसरे और चौथे उदाहरण को खत्म करने के लिए, अपने regex को इस तरह बनाएं:
^[0-9]+_([a-z]+)_[0-9a-z]*
जो कहता है कि स्ट्रिंग को एक या अधिक अंकों से शुरू करना चाहिए । कैरेट स्ट्रिंग की शुरुआत का प्रतिनिधित्व करता है। यदि आप regex के अंत में एक डॉलर का चिह्न जोड़ते हैं, तो इस तरह:
^[0-9]+_([a-z]+)_[0-9a-z]*$
फिर तीसरा उदाहरण भी समाप्त हो जाएगा क्योंकि डॉट रेगेक्स में पात्रों के बीच नहीं है और डॉलर का चिह्न स्ट्रिंग के अंत का प्रतिनिधित्व करता है। ध्यान दें कि चौथा उदाहरण इस मैच को भी विफल करता है।
यदि आपके पास जीएनयू है grep
(लगभग 2.5 या बाद में, मुझे लगता है, जब \K
ऑपरेटर जोड़ा गया था):
name=$(echo "$f" | grep -Po '(?i)[0-9]+_\K[a-z]+(?=_[0-9a-z]*)').jpg
\K
ऑपरेटर (चर लंबाई लुक-पीछे) मैच के लिए पूर्ववर्ती पैटर्न का कारण बनता है, लेकिन परिणाम में मैच शामिल नहीं है। निर्धारित लंबाई समतुल्य है (?<=)
- पैटर्न को कोष्ठक बंद करने से पहले शामिल किया जाएगा। आप का उपयोग करना चाहिए \K
अगर परिमाणकों अलग-अलग लंबाई के तार से मेल कर सकते हैं (उदाहरण के लिए +
, *
, {2,4}
)।
(?=)
ऑपरेटर मैचों निश्चित या चर लंबाई पैटर्न और "रंग-रूप-आगे" कहा जाता है। यह परिणाम में मिलान किए गए स्ट्रिंग को भी शामिल नहीं करता है।
मैच को असंवेदनशील बनाने के लिए, द (?i)
ऑपरेटर का उपयोग किया जाता है। यह उन पैटर्नों को प्रभावित करता है जो इसका अनुसरण करते हैं इसलिए इसकी स्थिति महत्वपूर्ण है।
फ़ाइल नाम में अन्य वर्ण हैं या नहीं, इसके आधार पर regex को समायोजित करने की आवश्यकता हो सकती है। आप ध्यान देंगे कि इस मामले में, मैं एक स्ट्रिंग को एक ही समय में बदलने का एक उदाहरण दिखाता हूं कि सबस्ट्रिंग कैप्चर किया गया है।