2013-04-22 3 views
6

अंतिम सूचकांक लंगड़े के सवाल के लिए खेद है, लेकिन मैं इसे काम करने में सक्षम नहीं लग रहा हूं।बैश

मैं निम्नलिखित सरल मामला है:

  • मेरे पास चर artifact-1.2.3.zip तरह

  • मैं हाइफन और डॉट के अंतिम सूचकांक के बीच एक उप-स्ट्रिंग प्राप्त करना चाहते हैं (दोनों अनन्य)।

मेरा बैश कौशल बहुत मजबूत नहीं है।

a="artifact-1.2.3.zip"; b="-"; echo ${a:$(($(expr index "$a" "$b" + 1) - $(expr length "$b")))} 

उत्पादन:

1.2.3.zip 

मैं कैसे .zip भाग के रूप में अच्छी तरह से निकालूँ मैं निम्नलिखित है?

उत्तर

4
$ a="artifact-1.2.3.zip"; a="${a#*-}"; echo "${a%.*}" 

'#पैटर्न' को हटा पैटर्न इतने लंबे समय के रूप में यह से मेल खाता है $a की शुरुआत। पैटर्न का सिंटैक्स फ़ाइल नाम मिलान में उपयोग किया जाता है। हमारे मामले में,

  • * वर्णों के किसी अनुक्रम है।
  • - का मतलब शाब्दिक डैश है।
  • इस प्रकार #*- सब कुछ से मेल खाता है, और पहले डैश सहित।
  • इस प्रकार ${a#*-} जो कुछ $a का विस्तार होता है, कि artifact- छोड़कर विस्तार से निकाल दिया जाता, 1.2.3.zip के साथ हमें छोड़ने के लिए फैलता है।

इसी तरह, '%पैटर्न' को हटा पैटर्न इतने लंबे समय के रूप में यह विस्तार के अंत मेल खाता है। हमारे मामले में,

  • . एक शाब्दिक डॉट।
  • * वर्णों का कोई अनुक्रम।
  • इस प्रकार %.* स्ट्रिंग के अंत तक अंतिम डॉट समेत सब कुछ है।
  • इस प्रकार $a1.2.3.zip, तक फैलता है तो ${a%.*}1.2.3 तक फैलता है।

काम किया।

 
     ${parameter#word} 
     ${parameter##word} 
       The word is expanded to produce a pattern just as in pathname 
       expansion. If the pattern matches the beginning of the value of 
       parameter, then the result of the expansion is the expanded 
       value of parameter with the shortest matching pattern (the ``#'' 
       case) or the longest matching pattern (the ``##'' case) deleted. 
       If parameter is @ or *, the pattern removal operation is applied 
       to each positional parameter in turn, and the expansion is the 
       resultant list. If parameter is an array variable subscripted 
       with @ or *, the pattern removal operation is applied to each 
       member of the array in turn, and the expansion is the resultant 
       list. 

     ${parameter%word} 
     ${parameter%%word} 
       The word is expanded to produce a pattern just as in pathname 
       expansion. If the pattern matches a trailing portion of the 
       expanded value of parameter, then the result of the expansion is 
       the expanded value of parameter with the shortest matching pat- 
       tern (the ``%'' case) or the longest matching pattern (the 
       ``%%'' case) deleted. If parameter is @ or *, the pattern 
       removal operation is applied to each positional parameter in 
       turn, and the expansion is the resultant list. If parameter is 
       an array variable subscripted with @ or *, the pattern removal 
       operation is applied to each member of the array in turn, and 
       the expansion is the resultant list. 

HTH:

इस के लिए आदमी पृष्ठ की सामग्री के रूप में निम्नानुसार (कम से कम मेरी मशीन, YMMV पर) है!

विस्तृत जवाब के लिए संपादित करें @ x4d को

कुडोस। फिर भी सोचें कि लोगों को आरटीएफएम होना चाहिए। यदि वे मैन्युअल, को नहीं समझते हैं तो एक और प्रश्न पोस्ट करें।

+0

अच्छा और सरल, धन्यवाद! – carlspring

+5

यहां सूचीबद्ध कोई स्पष्टीकरण या संबंधित दस्तावेज़ बेहतर होगा। – Judking

+0

आरटीएफएम। निष्पक्ष होने के लिए मैन पेज बहुत बड़ा है। उस फ़ाइल में लगातार दो हैश की तलाश करें और आप सही क्षेत्र में होंगे ('/ ##' _less_ में कमांड) – bobbogo

0

मुझे लगता है कि आप यह कर सकते हैं:

string=${a="artifact-1.2.3.zip"; b="-"; echo ${a:$(($(expr index "$a" "$b" + 1) - $(expr length "$b")))}} 

substring=${string:0:4} 

अंतिम चरण स्ट्रिंग से पिछले 4 वर्ण निकालता है। here पर कुछ और जानकारी है।

+0

+1: हालांकि यह मुझे तीन-अक्षर एक्सटेंशन से जोड़ देगा। मैं बॉबबोगो के जवाब को स्वीकार करूंगा। धन्यवाद! – carlspring

+0

धन्यवाद, कोई समस्या नहीं, यह एक बहुत पोर्टेबल समाधान नहीं है, लेकिन मुझे चीजों को सरल रखना पसंद है :)। बॉबबोगो का समाधान जाने का रास्ता है। – James

3

का उपयोग बैश RegEx सुविधा:

>str="artifact-1.2.3.zip" 
[[ "$str" =~ -(.*)\.[^.]*$ ]] && echo ${BASH_REMATCH[1]} 
21

bash आदमी इस पृष्ठ का शीर्षक अनुभाग "चर प्रतिस्थापन" ${var#pattern}, ${var##pattern}, ${var%pattern}, और ${var%%pattern} का उपयोग कर का वर्णन है।

मान लें कि आप एक चर filename कहा जाता है, उदाहरण के लिए,

filename="artifact-1.2.3.zip" 

तो, अनुसरण कर रहे हैं पैटर्न आधारित निष्कर्षण:

% echo "${filename%-*}" 
artifact 

% echo "${filename##*-}" 
1.2.3.zip 

मैं ## बजाय # का उपयोग क्यों किया?

फ़ाइल नाम संभवतः इस तरह के रूप में डैश, हो सकता है, तो:

filename="multiple-part-name-1.2.3.zip" 

तो दो निम्न स्थानापन्न तुलना:

% echo "${filename#*-}" 
part-name-1.2.3.zip 

% echo "${filename##*-}" 
1.2.3.zip 

एक बार संस्करण और विस्तार निकाला है, संस्करण अलग करने के लिए, उपयोग:

% verext="${filename##*-}" 
% ver="${verext%.*}" 
% ext="${verext##*.}" 
% echo $ver 
1.2.3 
% echo $ext 
zip 
+0

मैं इसे भी आजमाउंगा! विस्तृत विवरण के लिए धन्यवाद। – carlspring