2011-04-11 8 views
8

में कैप्चर का संदर्भ कैसे लें I BASH में प्रतिस्थापन अभिव्यक्ति में रेगेक्स मैच कैसे शामिल कर सकता हूं?बैश रेगेक्स प्रतिस्थापन

बेकार उदाहरण:

#!/bin/bash 
name=joshua 
echo ${name//[oa]/X\1} 

मैं मिलान किया चरित्र द्वारा प्रतिस्थापित किया जा \1 साथ उत्पादन jXoshuXa की उम्मीद है।

यह वास्तव में काम नहीं करता है और इसके बजाय jX1shuX1 आउटपुट करता है।

+2

मुझे '$ {foo/bar/baz}' वाक्यविन्यास का उपयोग कर रेगेक्स प्रतिस्थापन करने में सक्षम होने के बारे में बैश (4.1.5) के मेरे संस्करण में कुछ भी दिखाई नहीं देता है। क्या आपके पास कोई संदर्भ नहीं है कि आपको ऐसा क्यों लगता है कि आपको ऐसा करने में सक्षम होना चाहिए? –

+0

मुझे यकीन नहीं है कि मैं इसे कहां ठोकर खा रहा हूं लेकिन यह काम करता है। ऊपर दिए गए मेरे उदाहरण का उपयोग करके आप देख सकते हैं कि यह 'ओ' और' ए' को 'एक्स' के साथ बदल रहा है। बहुत चालाक – joshuapoehls

+0

http://tldp.org/LDP/abs/html/parameter-substitution.html देखें, इसका विवरण पृष्ठ के नीचे के लगभग 3/4 है। –

उत्तर

7
bash> name=joshua 
bash> echo $name | sed 's/\([oa]\)/X\1/g' 
jXoshuXa 
+0

यदि आप sed के लिए पहुंचने जा रहे हैं, तो यह आसान है: 's/[oa]/X &/g' –

+0

धन्यवाद! मैं उम्मीद कर रहा था कि 'sed' को कॉल किए बिना ऐसा करने में सक्षम हो लेकिन यह भी काम करना चाहिए। – joshuapoehls

22

शायद सहज और नहीं के रूप में यकीनन सब नरक के रूप में लेकिन पूर्णता की भावना में अस्पष्ट, जब तक हम मार के लिए प्रतीक्षा कैप्चर में आने के लिए की जगह है, तो निम्न वर्तमान में संभव है।

#!/bin/bash 
name='joshua' 
[[ $name =~ ([ao].*)([oa]) ]] && \ 
    echo ${name/$BASH_REMATCH/X${BASH_REMATCH[1]}X${BASH_REMATCH[2]}} 

उस उदाहरण में हम जानते हैं कि हम क्या खोज रहे हैं। मैच के समीप सभी या वैश्विक रेगेक्स समकक्ष निम्नलिखित उदाहरण लालसा मैच के बिना संग्रह की आखिरी घटना के लिए लालची मैच करेंगे और जब तक कोई भी नहीं रहेगा तब तक पीछे की ओर बढ़ेगा।

#/bin/bash 
name='joshua' 
while [[ $name =~ .*[^X]([oa]) ]]; do 
    name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}} 
done 
echo $name 

उदाहरण जो मान लिया गया है के लिए एक ही ओ और एक वर्ण है जो एक एक्स पहले से जुड़ा हुआ नहीं है के बारे में परवाह अभिव्यक्ति /(?<!X)([oa])/X\1/ पीछे देखो के लिए इसी तरह काम करेंगे कि। दोनों उदाहरण

jXoshuXa 

एन ज्वॉय के लिए

उत्पादन!

संबंधित मुद्दे