2013-06-16 4 views
12

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

इस मामले में, मैं चर $line के अंत जो file.txt से पढ़ी जाती है पर शुरुआत में http://, और /score/ निकालना चाहते हैं। ताकि आप अस्थायी चर का उपयोग करना होगा

$ string="fooSTUFFfoo" 
$ string="${string%foo}" 
$ string="${string#foo}" 
$ echo "$string" 
STUFF 
+0

पैटर्न किस तरह का? क्या तुम्हारे लिए थोडा और अधिक विशिष्ट होना संभव है? –

+0

हां, इस मामले में: http: // शुरुआत में, और/स्कोर/अंत में। $ Line को एक फ़ाइल.txt – bobylapointe

+0

से पढ़ा जाता है जो आप खोज रहे हैं पैरामीटर विस्तार है, विशेष रूप से आपके मामले में '$ {पैरामीटर # शब्द}' और '$ {पैरामीटर% शब्द}' के अंत के पास बैश मैनुअल] (http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html) – doubleDown

उत्तर

17

ठीक है, आप घोंसला ${var%}/${var#} संचालन नहीं कर सकते हैं,:

+0

मैं नियमित अभिव्यक्तियों से अधिक परिचित हूं।यह दिलचस्प है। मैं थोड़ा सा जानता हूँ। प्रश्न यह है कि, किसी अन्य कमांड में इसका उपयोग करने के लिए sed द्वारा उत्पादित आउटपुट का उपयोग कैसे करें। आइए एक स्क्रिप्ट शुरू करने के लिए कहें। ./script.sh $ variablemodifiedbysed – bobylapointe

+2

यह दिखाने के लिए उत्तर अपडेट किया गया कि पुन: उपयोग के लिए sed के आउटपुट को चर में संग्रहीत किया जा सकता है। –

+0

यह अंत में एक आकर्षण की तरह काम करता है। मैं इसे समझने में दो घंटे बिता रहा हूं। मुझे यकीन है कि अन्य भी काम करते हैं, लेकिन फिर से, मुझे नियमित अभिव्यक्तियों का उपयोग करना पसंद है। धन्यवाद दोस्त ! – bobylapointe

2

आप 2 चरणों में यह करने के लिए किया है।

यहाँ की तरह:

some_variable="$(echo "$var" | sed -e 's#^http://##; s#/score/$##')" 
+0

मेरे मामले में, स्ट्रिंग 'बू' या 'foo' से शुरू हो सकती है या नहीं और यदि यह उनमें से किसी के साथ शुरू होता है तो मैं एक स्ट्रिंग की शुरुआत से "बू" या "foo" को हटाने के लिए पार्सिंग में कैसे लागू कर सकता हूं? – Nazar

2
$ var='https://www.google.com/keep/score' 
$ var=${var#*//} #removes stuff upto // from begining 
$ var=${var%/*} #removes stuff from/all the way to end 
$ echo $var 
www.google.com/keep 
2

यह केवल बनाया का उपयोग कर एक कदम करने के लिए एक तरीका नहीं है:

var="http://whatever/score/" 
temp_var="${var#http://}" 
echo "${temp_var%/score/}" 

वैकल्पिक रूप से, आप के साथ (उदाहरण के लिए) sed रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं -शैश कार्यक्षमता (sed जैसे कोई बाहरी प्रोग्राम नहीं चल रहा है) - BASH_REMATCH:

url=http://whatever/score/ 
re='https?://(.*)/score/' 
[[ $url =~ $re ]] && printf '%s\n' "${BASH_REMATCH[1]}" 

यह =~ परीक्षण के दाईं ओर नियमित अभिव्यक्ति के खिलाफ मेल खाता है, और समूहों को BASH_REMATCH सरणी में डालता है।


कहा, यह दो पीई भाव और एक अस्थायी चर का उपयोग करने के लिए और अधिक परंपरागत है: ऊपर के उदाहरण में

shopt -s extglob 
url=http://whatever/score/ 
val=${url#http?(s)://}; val=${val%/score/} 
printf '%s\n' "$val" 

..., extglob विकल्प खोल मान्यता प्राप्त करने के लिए "अनुमति देने के लिए प्रयोग किया जाता है extglobs "- ग्लोब वाक्यविन्यास के लिए बैश के एक्सटेंशन (नियमित अभिव्यक्तियों के लिए बिजली में समान ग्लोब-स्टाइल पैटर्न बनाना), जिनमें से ?(foo) का अर्थ है कि foo वैकल्पिक है।


वैसे, मैं printf इन उदाहरणों में echo उपयोग कर रहा हूँ के बजाय क्योंकि echo के व्यवहार के कई कार्यान्वयन से परिभाषित कर रहे हैं - उदाहरण के लिए, इस मामले में जहां चर की सामग्री को -e या -n हैं पर विचार करें।

0

कैसे

के बारे में
export x='https://www.google.com/keep/score'; 
var=$(perl -e 'if ($ENV{x} =~ /(https:\/\/)(.+)(\/score)/) { print qq($2);}') 
संबंधित मुद्दे