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 इसका समर्थन करता है।