एक स्ट्रिंग के केवल भाग को बैश में एक चर पर असाइन करना


11

मैं उपयोगकर्ता से एक निश्चित निरपेक्ष filepath प्राप्त करते हैं, और मैं एक चर कि एक स्ट्रिंग है कि केवल शामिल नहीं होगा किया जाएगा बनाना चाहते हैं सबसे पहले है, लेकिन यह मुद्रण या कुछ भी बिना फ़ाइल पथ के दो घटक।

उदाहरण के लिए, पूर्ण पथ हो सकता है:

/home/myusername/folder1/folder2/folder3

और यह "target_path" में सहेजा गया है, और मैं चाहता हूं कि "mydir" केवल:

/folder1/folder2/folder3

मैंने विभिन्न तरीकों से कट कमांड का उपयोग करने की कोशिश की लेकिन सफलता के बिना।


क्या अदृश्य उपयोगकर्ता /home/usernameकी वास्तविक $HOMEनिर्देशिका है? यदि ऐसा है तो आप इसे केवल mydir="${target_path#$HOME}"मेरे विचार से उपयोग कर सकते हैं
स्टीलड्राइवर

जवाबों:


15

बैश का स्ट्रिंग हेरफेर का उपयोग करना :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

तो, जो स्ट्रिंग आप चाहते हैं वह (प्रमुख स्लैश को वापस जोड़ना) होगी:

b="/${a#/*/*/}"

एक चर के लिए a, ${a#foo}कम से कम स्ट्रिंग मिलान निकाल देंगे fooसे शुरू की a। तो, हम सबसे छोटे तार को हटाते हैं जिसमें तीन /(पथ में अग्रणी स्लैश शामिल है), पूर्ण पथ के पहले दो घटकों को हटाने के लिए।


पथ 30 फ़ोल्डर हो सकता है, और मैं केवल अंतिम 28 को शामिल करना चाहता हूं। क्या यह अभी भी काम करेगा?
का जीवन

@Lifeofpi क्यों नहीं?
मूरू

9

यहां एक उदाहरण दिया गया है cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

यदि आपको अग्रणी की आवश्यकता है तो आप अपनी पंक्ति के अंत में /संलग्न हो सकते हैं | sed 's/^/\//'

आपको इसकी आवश्यकता है -f4-क्योंकि खेतों के बीच सीमांकक के रूप में उपयोग करने के लिए -d '/'कहता cutहै /। तो पहला क्षेत्र पहले परिसीमन से पहले आता है, इस मामले में पहला क्षेत्र खाली है। तो folder14 वें क्षेत्र है और -f4-4 वें से सभी क्षेत्रों का उपयोग करने के लिए कट बताता है।


7

आप बैश पैरामीटर विस्तार का उपयोग कर सकते हैं जैसे:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

इसके बाद:

echo $myvar

देता है:

/folder1/folder2/folder3

यह शेल पैरामीटर विस्तार सिंटैक्स /*/*/का उपयोग करके आपके target_path चर से पैटर्न के पहले मैच को हटाकर काम करता है ${target_path#pattern}। दुर्भाग्य से यह पहला /चरित्र निकालता है , यही कारण है कि myvar चर सेट करते समय उस चरित्र को स्पष्ट रूप से शामिल किया जाना चाहिए।

चेतावनी: आपको जाँचना चाहिए कि आपके target_path चर में कुछ वर्ण हैं, और इस पद्धति का उपयोग करने से पहले दो पथ खंडों से अधिक लंबा है। उदाहरण के लिए अगर target_path=/home/username/है, तो myvar=/। यह आपके सिस्टम के लिए खतरनाक हो सकता है यदि आप कुछ पसंद कर रहे हैं rm -rf "$myvar"*यह कोशिश मत करो!


पथ 30 फ़ोल्डर हो सकता है, और मैं केवल अंतिम 28 को शामिल करना चाहता हूं। क्या यह अभी भी काम करेगा?
का जीवन

निश्चित रूप से, यह केवल पहले दो को छाँटेगा, चाहे रास्ता कितना भी लंबा क्यों न हो।
एरॉनिकल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.