2012-08-03 14 views
15

मेरे पास तीन प्रकार के तार हैं जिन्हें मैं एक बैश स्क्रिप्ट में कैपिटल बनाना चाहता हूं। मुझे लगा कि sed/awk मेरी सबसे अच्छी शर्त होगी, लेकिन मुझे यकीन नहीं है। निम्नलिखित आवश्यकताओं को देने का सबसे अच्छा तरीका क्या है?sed/awk capitalize स्ट्रिंग्स

1.) एकल शब्द उदा। taco -> Taco

2.) हाइफ़न उदा। my-fish-tacos -> My-Fish-Tacos

3.) अंडरस्कोर उदा। my_fish_tacos -> My_Fish_Tacos

उत्तर

26

कैप्चर समूहों (हालांकि & एक तरह से एक से एक है) का उपयोग करने की आवश्यकता नहीं है निचले मामले से बच निकले "यू" मिलान किए गए उप-स्ट्रिंग में अगले चरित्र को कैपिटल करता है।

+0

मैं सभी कैप्स वाले शब्दों को संभालने के लिए इसे कैसे संशोधित करूं? उदाहरण के लिए मेरे-फिश-टैकोस को माई-फिश-टैकोस को आउटपुट करना चाहिए। – GregB

+4

@GregB: इसे सभी वर्णों को कम करने के लिए कहें, फिर अगले को अपरकेस करें: 'sed's/[^ _-] */\ L \ u &/g'' –

+2

नोट: यह एक जीएनयू sed एक्सटेंशन है।बीएसडी sed उपयोगकर्ता (ओएस एक्स सहित) यह नहीं कर सकते हैं। – Jashank

6

निम्नलिखित का प्रयास करें:

sed 's/\([a-z]\)\([a-z]*\)/\U\1\L\2/g' 

यह मेरे लिए काम करता है जीएनयू sed का उपयोग कर, लेकिन मुझे नहीं लगता बीएसडी sed \U और \L का समर्थन करता है है।

6

का उपयोग awk:

echo "taco my-fish-tacos my_fish_tacos" | sed 's/[^ _-]*/\u&/g' 

उत्पादन:

Taco My-Fish-Tacos My_Fish_Tacos 

echo 'test' | awk '{ 
    for (i=1; i <= NF; i++) { 
     sub(".", substr(toupper($i), 1,1) , $i); 
     print $i; 
     # or 
     # print substr(toupper($i), 1,1) substr($i, 2); 
    } 
}' 
+0

ऊपर के उदाहरण के बारे में विवरण के बारे में थोड़ी: ** एनएफ ** - निर्मित awk वैरिएबल फ़ील्ड की संख्या (आम तौर पर दिखाता है कि कितने व्हाइटस्पेस से अलग तार आप एक पंक्ति पर है) से आता है - इस उदाहरण में यह 1 ** सबस्ट्र ** लौटाएगा - सबस्ट्रिंग देता है, घोषणा इस ** substr (स्ट्रिंग, प्रारंभ, लंबाई) ** की तरह दिखती है। ** उप ** - विकल्प समारोह - ** उप (regex, प्रतिस्थापन, लक्ष्य) ** –

+1

नोट: यह संभवतः 'toupper (substr (...' 'substr (toupper (.. के बजाय 'का उपयोग करने के लिए थोड़ा अधिक कुशल है। । –

3

यहां एक समाधान है जो \u का उपयोग नहीं करता है, जो सभी seds के लिए आम नहीं है।

सहेजें capitalize.sed में इस फ़ाइल है, तो चलाने sed -i -f capitalize.sed FILE

s:^:.: 
h 
y/qwertyuiopasdfghjklzxcvbnm/QWERTYUIOPASDFGHJKLZXCVBNM/ 
G 
s:$:\n: 
:r 
/^.\n.\n/{s:::;p;d} 
/^[^[:alpha:]][[:alpha:]]/ { 
    s:.\(.\)\(.*\):x\2\1: 
    s:\n\(..\):\nx: 
    tr 
} 

/^[[:alpha:]][[:alpha:]]/ { 
    s:\n.\(.\)\(.*\)$:\nx\2\1: 
    s:..:x: 
    tr 
} 
/^[^\n]/ { 
    s:^.\(.\)\(.*\)$:.\2\1: 
    s:\n..:\n.: 
    tr 
} 
1

यह आप के लिए काम कर सकते हैं (जीएनयू sed):

echo "aaa bbb ccc aaa-bbb-ccc aaa_bbb_ccc aaa-bbb_ccc" | sed 's/\<.\|_./\U&/g' 
Aaa Bbb Ccc Aaa-Bbb-Ccc Aaa_Bbb_Ccc Aaa-Bbb_Ccc 
0

alinsoar के मन-बह समाधान बिल्कुल Plan9 में काम नहीं करता sedbox, या व्यस्त बॉक्स में सही ढंग से। लेकिन आपको अभी भी यह पता लगाने की कोशिश करनी चाहिए कि यह कैसे करना चाहिए: आप sed के बारे में बहुत कुछ सीखेंगे।

यहां कम से कम प्लान 9, व्यस्त बॉक्स और जीएनयू sed (और शायद बीएसडी और मैकोज़) में काम करने वाले संस्करण को समझने में आसान नहीं है। Plan9 sed को s कमांड के मिलान भाग में हटाए गए बैकस्लाश की आवश्यकता है।

#! /bin/sed -f 

y/PYFGCRLAOEUIDHTNSQJKXBMWVZ/pyfgcrlaoeuidhtnsqjkxbmwvz/ 

s/\(^\|[^A-Za-z]\)a/\1A/g 
s/\(^\|[^A-Za-z]\)b/\1B/g 
s/\(^\|[^A-Za-z]\)c/\1C/g 
s/\(^\|[^A-Za-z]\)d/\1D/g 
s/\(^\|[^A-Za-z]\)e/\1E/g 
s/\(^\|[^A-Za-z]\)f/\1F/g 
s/\(^\|[^A-Za-z]\)g/\1G/g 
s/\(^\|[^A-Za-z]\)h/\1H/g 
s/\(^\|[^A-Za-z]\)i/\1I/g 
s/\(^\|[^A-Za-z]\)j/\1J/g 
s/\(^\|[^A-Za-z]\)k/\1K/g 
s/\(^\|[^A-Za-z]\)l/\1L/g 
s/\(^\|[^A-Za-z]\)m/\1M/g 
s/\(^\|[^A-Za-z]\)n/\1N/g 
s/\(^\|[^A-Za-z]\)o/\1O/g 
s/\(^\|[^A-Za-z]\)p/\1P/g 
s/\(^\|[^A-Za-z]\)q/\1Q/g 
s/\(^\|[^A-Za-z]\)r/\1R/g 
s/\(^\|[^A-Za-z]\)s/\1S/g 
s/\(^\|[^A-Za-z]\)t/\1T/g 
s/\(^\|[^A-Za-z]\)u/\1U/g 
s/\(^\|[^A-Za-z]\)v/\1V/g 
s/\(^\|[^A-Za-z]\)w/\1W/g 
s/\(^\|[^A-Za-z]\)x/\1X/g 
s/\(^\|[^A-Za-z]\)y/\1Y/g 
s/\(^\|[^A-Za-z]\)z/\1Z/g 
संबंधित मुद्दे