ksh93और zshबैक-रेफरेंस (या अधिक सटीक 1 , प्रतिस्थापन में समूहों को कैप्चर करने के लिए संदर्भ) का समर्थन अंदर है ${var/pattern/replacement}, नहीं bash।
ksh93:
$ var='Blah: -> r1-ae0-2 / [123]'
$ printf '%s\n' "${var/*@(->*([[:space:]])+([^[:space:]]))*/\1}"
-> r1-ae0-2
zsh:
$ var='Blah: -> r1-ae0-2 / [123]'
$ set -o extendedglob
$ printf '%s\n' "${var/(#b)*(->[[:space:]]#[^[:space:]]##)*/$match[1]}"
-> r1-ae0-2
( mkshमैन पेज में यह भी उल्लेख है कि भविष्य के संस्करण ${KSH_MATCH[1]}पहले कैप्चर ग्रुप के लिए इसका समर्थन करेंगे। 2017-04-25 तक उपलब्ध नहीं है)।
हालाँकि, bashआप कर सकते हैं:
$ [[ $var =~ -\>[[:space:]]*[^[:space:]]+ ]] &&
printf '%s\n' "${BASH_REMATCH[0]}"
-> r1-ae0-2
जो बेहतर है क्योंकि यह जांचता है कि पैटर्न पहले पाया गया है।
यदि आपके सिस्टम का regexps समर्थन \s/ करता है \S, तो आप यह भी कर सकते हैं:
re='->\s*\S+'
[[ $var =~ $re ]]
इसके साथ zsh, आप PCRE की पूरी शक्ति प्राप्त कर सकते हैं:
$ set -o rematchpcre
$ [[ $var =~ '->\s*\S+' ]] && printf '%s\n' $MATCH
-> r1-ae0-2
इसके साथ zsh -o extendedglob, यह भी देखें:
$ printf '%s\n' ${(SM)var##-\>[[:space:]]#[^[:space:]]##}
-> r1-ae0-2
portably:
$ expr " $var" : '.*\(->[[:space:]]*[^[:space:]]\{1,\}\)'
-> r1-ae0-2
यदि स्ट्रिंग में पैटर्न की कई घटनाएं होती हैं, तो उन सभी समाधानों के साथ व्यवहार अलग-अलग होगा। हालाँकि उनमें से कोई भी आपको अपने GNU- grepआधारित समाधान की तरह सभी मैचों की एक नई सूची से अलग नहीं देगा ।
ऐसा करने के लिए, आपको हाथ से लूपिंग करने की आवश्यकता होगी। उदाहरण के लिए, इसके साथ bash:
re='(->\s*\S+)(.*)'
while [[ $var =~ $re ]]; do
printf '%s\n' "${BASH_REMATCH[1]}"
var=${BASH_REMATCH[2]}
done
इसके साथ zsh, आप सभी मैचों को एक सरणी में संग्रहीत करने के लिए इस तरह की चाल का सहारा ले सकते हैं:
set -o extendedglob
matches=() n=0
: ${var//(#m)->[[:space:]]#[^[:space:]]##/${matches[++n]::=$MATCH}}
printf '%s\n' $matches
1 बैक-रेफरेंस आमतौर पर एक पैटर्न को निर्दिष्ट करता है जो एक पुराने समूह द्वारा मिलान किए गए संदर्भ को संदर्भित करता है। उदाहरण के लिए, \(.\)\1मूल नियमित अभिव्यक्ति एक ही चरित्र के बाद उसी चरित्र से मेल खाती है (यह मेल खाता है aa, पर नहीं ab)। यह उसी पैटर्न में \1उस \(.\)कैप्चर ग्रुप का बैक-रेफरेंस है ।
ksh93अपने प्रतिमानों में बैक-रेफरेंस का समर्थन करता है (उदाहरण के ls -d -- @(?)\1लिए फ़ाइल के नामों को सूचीबद्ध करेगा जिसमें दो समान अक्षर होते हैं), अन्य गोले नहीं। मानक BRE और PCRE बैक-रेफ़रेंस का समर्थन करते हैं लेकिन मानक ERE का नहीं, हालाँकि कुछ ERE कार्यान्वयन इसे विस्तार के रूप में समर्थन करते हैं। bash's [[ foo =~ re ]]का उपयोग करता है eres।
[[ aa =~ (.)\1 ]]
मेल नहीं खाएगा, लेकिन
re='(.)\1'; [[ aa =~ $re ]]
हो सकता है कि सिस्टम का ERE इसका समर्थन करता है।