2013-01-09 35 views
6

मैं अपने संगीत में सफाई के लिए एक बैश स्क्रिप्ट लिख रहा हूं।लिनक्स नाम बदलें अपरकेस पहला अक्षर

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g" 

कौन सा मैं एक पाठ फ़ाइल के लिए फ़ाइल नाम जोड़ने के लिए इस्तेमाल किया और फिर sed:

मैं यह सब फ़ाइल नाम से प्रारूप और उन्हें बनाने और इतने एक छोटे से इंटरनेट खोज के साथ मैं इस लाइन में लिखा था चाहता था यह, लेकिन तब मुझे नहीं पता था कि फाइलों में नए नाम कैसे लागू करें।

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

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" * 

अब, नाम बदलने में कोड (संतोषजनक ढंग से कम से कम) काम कर रहा है, एक अंतरिक्ष चरित्र के बाद केवल एक पत्र की खोज, लेकिन यह प्रतिस्थापन कि समस्याग्रस्त है। मैंने कई अलग-अलग दृष्टिकोणों की कोशिश की है, सभी मुझे परिणाम के साथ छोड़कर इस मामले में फोकस में पहला अक्षर बिल्कुल ए-जेड में आदान-प्रदान किया जाता है।

नाम मैनुअल पेज में यह कम केस अपरकेस बनाने के लिए कहता है जो आप करते हैं/ए-जेड/ए-जेड/जी 'लेकिन यह समझना आसान है कि यह केवल ए-जेड ए-जेड पाता है। तो यही मुझे मदद चाहिए।

कोई बोनस होगा अगर कोई जानता है कि इसे उदाहरण के उदाहरण में कैसे करना है, जहां \ < प्रत्येक शब्द की शुरुआत से मेल खाता है, क्योंकि फिलहाल, मेरा नाम कमांड पहले शब्द पर लागू नहीं होगा और स्पष्ट कारणों से "डिस्क नाम [डिस्क 1]" जैसी कई डिस्क दिखाई देने पर न तो यह लागू होगा।

+0

मुझे लगता है कि आप अपनी पोस्ट पर "साइन ऑफ" रखना चाहते हैं। [ऐसा मत करो।] (Http://stackoverflow.com/faq#signatures) – chrisaycock

+0

यदि आपके पास पहले से ही स्रोत नाम और गंतव्य नाम जोड़े के साथ एक टेक्स्ट फ़ाइल है, तो 'sed' s/^/mv/'textfile | sh' आपको बस चाहिए (हालांकि रिक्त स्थान आदि के साथ फाइल नामों को उद्धृत करना चीजों को जटिल बनाता है; यह केवल अवधारणा का सबूत है, वास्तविक जवाब नहीं)। – tripleee

उत्तर

3

इस स्ट्रिंग \A की शुरुआत के लिए या खाली स्थान के \s कम से कम एक या एक से अधिक शब्द पात्रों द्वारा पीछा के लिए लग रहा है (एक-z, 0-9, अंडरस्कोर) \w+। यह सभी शब्द अनुक्रमों के पहले चरित्र को अपरकेस करेगा।

7

यह एक पर्ल प्रश्न है, क्योंकि rename पर्ल में लिखा गया है, और नामांकन करने के तरीके के लिए निर्देश एक पर्ल कमांड हैं।

s/// में प्रतिस्थापन के लिए यह जानने के लिए कि कौन सा पत्र ऊपरी-केस संस्करण को सम्मिलित करने के लिए है, इसे इनपुट से पत्र को 'कैप्चर करना' है। पैटर्न में अभिभावक यह करते हैं, परिवर्तनीय $1 में कैप्चर किए गए अक्षर को संग्रहीत करते हैं। और प्रतिस्थापन में \u अगले चरित्र को ऊपरी-केस बनाता है।

तो तुम कर सकते हैं:

$ rename 's/\s(\w)/ \u$1/g' * 

ध्यान दें कि प्रतिस्थापन भाग अपर-केस पत्र से पहले खाली स्थान शामिल करने की है, क्योंकि पैटर्न एक स्थान शामिल है और इसलिए दोनों अंतरिक्ष और मूल पत्र किया जा रहा है जगह ले ली। क्योंकि \w (regexs में अन्य प्रतीक की तरह) एक से मेल खाता है

$ rename 's/\b(\w)/\u$1/g' * 

इसके अलावा, आप, वहाँ में {1} की जरूरत नहीं है: आप एक शून्य चौड़ाई दावा है जो केवल एक शब्द सीमा पर से मेल खाता है \b का उपयोग करके इस से बच सकते हैं डिफ़ॉल्ट रूप से एकल चरित्र।

अंत में, नाम बदलने में उदाहरण (1) वास्तव में y/A-Z/a-z/y/// ऑपरेटर, नहीं s/// का उपयोग कर रहा है। y/// एक पूरी तरह से अलग ऑपरेटर है, जो एक दूसरे के साथ अक्षरों के एक सेट की सभी घटनाओं को प्रतिस्थापित करता है; यह आपके लिए उपयोग नहीं है, जहां यह केवल कुछ वर्ण हैं जिन्हें आप ऊपरी मामले बनाना चाहते हैं।

+0

इस पूरी व्याख्या के लिए धन्यवाद। इससे मुझे अपने लक्ष्य को प्राप्त करने में बड़े पैमाने पर मदद मिली। मैंने अपने पूरे प्रतिस्थापन फॉर्मूला को रेडिड किया और नाम बदल दिया/(\ w) (\ w {1,})/\ u $ 1 $ 2/g '*, जो एक पत्र की तलाश करता है और इसे $ 1, IF और केवल $ में कैप्चर करता है यदि वह पत्र कम से कम एक अन्य अक्षर के बाद होता है, और फिर यह $ 1 का पूंजीकरण करता है और बाकी शब्द को $ 2 का उपयोग करके प्रिंट करता है। मुझे यह समझने में कुछ समस्याएं थीं, \ b सीमा के साथ और पढ़ा कि यह एक दूसरे के बाद दो वर्णमाला पात्रों से मेल नहीं खाएगा, लेकिन \ B ने किया, हालांकि यह काम नहीं करता ... मुझे यकीन नहीं है कि क्यों इस समय। – Jompa

+0

'1 या अधिक' एक आम आवश्यकता है, इसलिए इसका अपना प्रतीक है, '+'। आप '\ w {1,}' के बजाय '\ w +' लिख सकते हैं। – Smylers

+0

'\ b' किसी शब्द वर्ण से एक गैर-शब्द वर्ण (या इसके विपरीत) में संक्रमण पर मिलान करता है। '\ B' विपरीत है, कहीं और मेल खाता है। तो '/ \ b \ w \ B /' एक शब्द वर्ण से मेल खाता है जिसमें इसके पहले कोई शब्द वर्ण नहीं होना चाहिए, लेकिन इसके बाद एक शब्द वर्ण हो। मतलब 's/\ b (\ w) \ B/\ u $ 1/g' आपके सूत्र के समान प्रभाव डालता है, लेकिन शब्दों के दूसरे और बाद के अक्षरों को फिर से वापस रखने के लिए परेशान नहीं करता है। – Smylers

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

  • कोई संबंधित समस्या नहीं^_^