2009-03-27 17 views
20

मैं निम्नलिखित पैटर्न बदलना चाहते हैं:लोअर केस को ऊपरी sed का उपयोग

getFoo_Bar 

रहे हैं:

getFoo_bar 

(ध्यान दें कम ख)

न foo को जानने का न ही बार, प्रतिस्थापन पैटर्न क्या है? "\ 2 छोटे अक्षर" मैं लिखना चाहते हैं, मुझे लगता है कि कैसे करते हो:

मैं

sed 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1 

लिखना शुरू किया, लेकिन मैं अटक कर रहा हूँ?

शायद sed को अनुकूलित नहीं किया गया है?

उत्तर

24
s/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g 

टेस्ट:

$ echo 'getFoo_Bar' | sed -e 's/\(get[A-Z][A-Za-z0-9]*_\)\([A-Z]\)/\1\L\2/g' 
getFoo_bar 
+1

उत्तर का विस्तार करने के लिए, यहां सभी सामान्य वर्णों को कम करने के लिए सामान्य अभिव्यक्ति है: 'echo getFoo_Bar | sed -e's/\ ([ए-जेड] [ए-ज़ा-जे 0-9] * \)/\ एल \ 1/g'', जो 'getfoo_bar' – espinchi

+7

उत्पन्न करता है ध्यान दें कि यह समाधान केवल जीएनयू sed के साथ काम करता है। POSIX sed में कोई '\ l' /' \ L'/'\ u' /' \ U'/'\ E' नहीं है। इस मामले में आप perl का उपयोग कर सकते हैं (देखें [@ user83591 का इस प्रश्न का उत्तर] (http://stackoverflow.com/a/689620/2451238)) या अजीब (देखें [मेरे दूसरे प्रश्न का उत्तर] (http: // stackoverflow .com/एक/18298882/2451238))। – mschilli

1

आप इस एक के लिए पर्ल का उपयोग कर सकते हैं:

perl -pe 's/(get[A-Z][A-Za-z0-9]*)_([A-Z])/\1_\l\2/' 

\ एल चाल यहाँ है।

sed मिलान समूहों पर ऊपरी/लोअरकेस नहीं करता है।

7

कुछ हद तक कम:

echo getFoo_Bar | sed 's/_\(.\)/_\L\1/' 
+0

'/ s (\। \)/\ L \ 1 /' के बारे में कैसे? – Beta

+0

मीठा! इस +1 –

33

getFoo_Bar को बदलने के लिए एसईडी का उपयोग कर getFoo_bar रहे हैं:

  • \U करने के लिए सभी पाठ बनाता है:

    echo "getFoo_Bar" | sed 's/^\(.\{7\}\)\(.\)\(.*\)$/\1\l\2\3/' 
    

    बड़े तथा छोटे अक्षरों द्वारा नियंत्रित किया जाता है सही अपरकेस।

  • \u सही अपरकेस के लिए केवल पहला अक्षर बनाता है।
  • \L सभी पाठ सही लोअरकेस में बनाता है।
  • \l दाएं निचले मामले में केवल पहला अक्षर बनाता है। (नोट करें कि इसका लोअरकेस अक्षर एल)

उदाहरण पैटर्न मिलान के लिए केवल एक विधि है, केवल टेक्स्ट के एक हिस्से को संशोधित करने के आधार पर। उदाहरण का उपयोग करके, getFoo_BAr getFoo_bAr में बदल जाता है, ध्यान दें कि ए को बदला नहीं गया था।

+1

जैसे किसी चीज़ के लिए हर जगह देखा गया \ N कमांड के बाद चीज़ों को सामान्य पर वापस लाने का कोई तरीका है? – Benjamin

+4

http://www.gnu.org/software/sed/manual/sed.html से: '\ E' _Stop केस रूपांतरण__ \ L' _or_' \ U' द्वारा शुरू किया गया। –

+2

यह एक अच्छा जवाब है जो मूल प्रश्न का उत्तर देने के बहुत दूर और परे जाता है। यह sed में सभी प्रकार के केस परिवर्तन कार्यों से निपटने के बारे में संदर्भ जानकारी प्रदान करता है। मुझे बहुत सारे शोध समय बचाया। धन्यवाद! – rustyx

5

सबसे छोटा मैं के साथ आ सकते हैं:

echo getFoo_Bar | sed 's/_./\L&/' 
+1

संभाल नहीं करता है '**' क्या करता है? – potong

-2
echo getFoo_Bar | sed 's/[Bb]/\L&/g' 
+0

आप बिंदु चूक गए। आप यहां एक वैश्विक खोज कर रहे हैं/यहां प्रतिस्थापित करें, अंडरस्कोर के बाद नहीं। –

0

तुम सिर्फ अंडरस्कोर के बाद छोटे अक्षरों में सब कुछ लिखने के लिए, की तुलना में यह आपके लिए काम करेंगे चाहते हैं:

echo getFoo_Bar | gawk -F_ '{print tolower($2)}' 
संबंधित मुद्दे

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