2011-03-19 9 views
17

मैं एक फ़ाइल के विस्तार को निकालने का तरीका पता है, जब मैं के रूप में जानते:यह जाने बिना दूर करने फ़ाइल से विस्तार

nameis=$(basename $dataset .csv) 

लेकिन मैं यह पहले से जानने के बिना किसी भी विस्तार निकालना चाहते हैं, क्या किसी को पता है कि कैसे करने के लिए यह करो?

किसी भी मदद की सराहना की है, टेड

उत्तर

27

बैश में आप निम्न कर सकते हैं:

nameis=${dataset%.*} 

... जैसे:

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

इस वाक्य रचना बैश आदमी पेज में वर्णन किया गया के रूप में:

$ {param eter% शब्द}

$ {पैरामीटर %% शब्द}

निकालें मिलान प्रत्यय पैटर्न। शब्द को पथनाम विस्तार के रूप में पैटर्न बनाने के लिए विस्तारित किया गया है। यदि पैटर्न पैरामीटर के विस्तारित मान के पीछे के हिस्से से मेल खाता है, तो विस्तार का परिणाम सबसे कम मिलान पैटर्न ("%" केस) या सबसे लंबा मिलान पैटर्न ("%%" केस के साथ पैरामीटर का विस्तारित मान है) हटा दिया गया। यदि पैरामीटर @ या * है, तो पैटर्न निष्कासन ऑपरेशन बदले में प्रत्येक स्थितित्मक पैरामीटर पर लागू होता है, और विस्तार परिणामस्वरूप सूची है। यदि पैरामीटर @ या * के साथ सब्सक्राइब किया गया एक सरणी चर है, तो पैटर्न निष्कासन ऑपरेशन बदले में सरणी के प्रत्येक सदस्य पर लागू होता है, और विस्तार परिणामस्वरूप सूची है।

1

कुछ ${dataset%.*} काम कर सकता है; एक्सटेंशन के बिना फ़ाइलों से सावधान रहें, हालांकि, यह एक ऐसे बिंदु की तलाश करेगा जो कट ऑफ करने के विस्तार का हिस्सा नहीं है।

1

आप पिछले डॉट निम्नलिखित सब कुछ को दूर कर सकता है, यदि कोई हो, sed साथ:

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

लेकिन है कि इस तरह .tar.gz के रूप में दोहरा एक्सटेंशन के साथ फ़ाइलों पर काम नहीं होता।

0

मुझे लगता है कि के लिए basename उपयोग sed आदेश, इस तरह के बजाय सुझाव है:

echo "$fileName" | sed 's/\..*$//g'

+0

कि एक के लिए असफल हो जायेगी फ़ाइल नामित है, उदाहरण के लिए, 'foo.bar.baz' अगर आप परिणाम' foo.bar' होना चाहते हैं। –

+0

यह मेरे लिए काफी अच्छा था, क्योंकि मैं चाहता था कि फ़ाइल नाम 'foo' दुर्भाग्यवश हो, जब निर्देशिका में एक डॉट भी हो, तो यह विफल हो जाता है। –

1

nameis = $ {। डाटासेट %% *} मानती है कि आपके basenames में से कोई भी उस में एक बिंदु है। यह बाईं ओर से सबसे लंबी संभव डॉटलेस स्ट्रिंग देता है।

5

अब, आप कुछ स्टाइलिश ओल्ड-स्कूल regexp चाहते हैं:

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

-> दूँ वापसी: foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

क्रिस्टियानो सेविनो

+0

स्पष्टीकरण के लिए धन्यवाद! –

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