एक-लाइनर सभी अपरकेस को लोअरकेस में बदलने के लिए?


131

मेरे पास एक टेक्स्टफाइल है जिसमें कुछ शब्द ALL CAPS में छपे हैं। मैं सिर्फ textfile में सब कुछ कन्वर्ट करने में सक्षम होना चाहते हैं लोअरकेस, का उपयोग कर sed। इसका मतलब है कि पहला वाक्य तब पढ़ा जाएगा, 'मेरे पास एक टेक्स्टफ़ाइल है जिसमें कुछ शब्द सभी कैप्स में छपे हैं।'


6
क्या आप trकमांड के बारे में जानते हैं ? कभी-कभी इससे अधिक उपयुक्त होता है sed
ब्रायन ओकले

@ ब्रायन ओकले मैं अब तक नहीं था। इस पर ध्यान दिलाने के लिए धन्यवाद। लेकिन मैं इसका उपयोग कैसे करूँ जो मैं पूछ रहा था?
मैग्नेटार

रघुराम के जवाब में दिए गए लिंक में देखें।
ब्रायन ओकले

1
अगर आपको sed, कैट <इनपुट> का उपयोग करना चाहिए | sed 'y / ABCDEFÑØÅÆŒ / abcdefñøå' / '<- आपको सभी वर्णों को बड़ा करना होगा, अपरकेस को नीचे करना होगा। मुझे पता है कि यह उन सभी पात्रों को लिखने के लिए बोझिल है, लेकिन यह उन सभी अंतर्राष्ट्रीय विशेष वर्णों के साथ भी काम करेगा। :)
Arno Teigseth

जवाबों:


248

के साथ tr:

# Converts upper to lower case 
$ tr '[:upper:]' '[:lower:]' < input.txt > output.txt

# Converts lower to upper case
$ tr '[:lower:]' '[:upper:]' < input.txt > output.txt

GNU sed(BSD sedसमर्थन नहीं करता है \L \U) का उपयोग कर काम करता है :

# Converts upper to lower case
$ sed -e 's/\(.*\)/\L\1/' input.txt > output.txt

# Converts lower to upper case
$ sed -e 's/\(.*\)/\U\1/' input.txt > output.txt

6
मुझे अपना जवाब खुद चुनना था क्योंकि मैं उन उत्तरों का प्रशंसक नहीं हूं, जिनमें सिर्फ लिंक होते हैं।
चुम्बक

6
OSX GNU एक्सटेंशन का समर्थन नहीं करता है :(
ekkis

2
sed -e 's/.*/\L&/' input.txt > output.txtGNU sed के लिए भी ठीक काम करता है
Asfand Qazi

1
@ekkis OSX BSD का उपयोग कर रहा है (जैसा कि उल्लेख किया गया है, BSD sed इसका समर्थन नहीं करता है)। man sedयह जानने के लिए कि आप किस संस्करण का उपयोग कर रहे हैं , यह जानने के लिए शीर्ष पंक्ति पढ़ने का प्रयास करें ।
राइडर

किसी कारण से जब मैं आपके ऊपरी मामले के पैटर्न का उपयोग करता हूं, तो यह Uप्रत्येक पंक्ति के सामने एक जोड़ देता है
Xtremefaith

51

यदि आपके पास GNU एक्सटेंशन हैं, तो आप sed के \ L (कम पूरे मैच का उपयोग कर सकते हैं, या जब तक \ L [लोअर] या \ E [अंत नहीं है - आवरण बंद हो जाता है] पहुँच जाता है), जैसे:

sed 's/.*/\L&/' <input >output

नोट: 'और' का अर्थ है पूर्ण मिलान पैटर्न।

साइड नोट के रूप में, GNU एक्सटेंशन में \ U (ऊपरी), \ u (मैच का ऊपरी अगला वर्ण), \ l (मैच का अगला वर्ण कम) शामिल होता है। उदाहरण के लिए, यदि आप एक वाक्य को ऊँचा करना चाहते हैं:

$ sed -r 's/\w+/\u&/g' <<< "Now is the time for all good men..." # Camel Case
Now Is The Time For All Good Men...

नोट: चूंकि यह धारणा है कि हमारे पास GNU एक्सटेंशन हैं, हम डैश-आर (एक्सटेंडेड रेगुलर एक्सप्रेशंस) विकल्प का भी उपयोग कर सकते हैं, जो \ w (वर्ड कैरेक्टर) की अनुमति देता है और आपको कैप्चरिंग कोष्ठक और एक या अधिक से बचने के लिए राहत देता है परिमाणक (+)। (एक तरफ: \W [non-word], \s [whitespace], \S [non-whitespace]भी पानी का छींटा-r के साथ समर्थन कर रहे हैं, लेकिन \d [digit]और \D [non-digit]नहीं कर रहे हैं।)


1
बहुत उपयोगी टिप। मैंने पाया है कि ऊंट के मामले में गोल कोष्ठक की आवश्यकता नहीं है। 's / \ w + / \ u & /' भी काम करता है।
PJ_Finnegan

1
sed -ri 's/MATCH_WHATEVER/\L&/i' input-file.ext- /iसंशोधक का उपयोग मैच को असंवेदनशील बनाता है और इस प्रकार वैकल्पिक है। -iस्विच यथा-स्थान फ़ाइल को बदलने के लिए sed बताता है। अगर आपको नहीं करना है तो आउटपुट को किसी अन्य फ़ाइल पर पुनर्निर्देशित करने की आवश्यकता नहीं है।
जिम

1
मुझे वास्तव में इसकी जरूरत थी \E [end - toggle casing off]। धन्यवाद !
मेहदी येदेस

37

awkयदि आप एक अलग उपकरण पर विचार करने के लिए तैयार हैं, तो आप यह भी आसानी से कर सकते हैं :

echo "UPPER" | awk '{print tolower($0)}'

1
इसका सबसे अच्छा जवाब, सिरौस सिरियल के साथ काम करता है। tr: - इसके साथ काम नहीं किया।
अमरोह

2
उच्चारण के साथ वर्णों के लिए देखें। उदाहरण के tolowerलिए संभाल करने में सक्षम नहीं होगाÀ
सैम ह्यूस्टन

आप उस आदेश के साथ फ़ाइलों का एक गुच्छा नाम बदल सकते हैं: ls | awk '{print "mv " $0 " " tolower($0)}' | sh
Neekobus

15

यहाँ कई समाधान हैं:

Perl, tr, sed और awk के साथ अपर्चर करने के लिए

perl -ne 'print uc'
perl -npe '$_=uc'
perl -npe 'tr/[a-z]/[A-Z]/'
perl -npe 'tr/a-z/A-Z/'
tr '[a-z]' '[A-Z]'
sed y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
sed 's/\([a-z]\)/\U\1/g'
sed 's/.*/\U&/'
awk '{print toupper($0)}'

Perl, tr, sed और awk से कम करने के लिए

perl -ne 'print lc'
perl -npe '$_=lc'
perl -npe 'tr/[A-Z]/[a-z]/'
perl -npe 'tr/A-Z/a-z/'
tr '[A-Z]' '[a-z]'
sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
sed 's/\([A-Z]\)/\L\1/g'
sed 's/.*/\L&/'
awk '{print tolower($0)}'

लोअरकेस में जटिल बैश:

while read v;do v=${v//A/a};v=${v//B/b};v=${v//C/c};v=${v//D/d};v=${v//E/e};v=${v//F/f};v=${v//G/g};v=${v//H/h};v=${v//I/i};v=${v//J/j};v=${v//K/k};v=${v//L/l};v=${v//M/m};v=${v//N/n};v=${v//O/o};v=${v//P/p};v=${v//Q/q};v=${v//R/r};v=${v//S/s};v=${v//T/t};v=${v//U/u};v=${v//V/v};v=${v//W/w};v=${v//X/x};v=${v//Y/y};v=${v//Z/z};echo "$v";done

अपरकेस को जटिल बैश:

while read v;do v=${v//a/A};v=${v//b/B};v=${v//c/C};v=${v//d/D};v=${v//e/E};v=${v//f/F};v=${v//g/G};v=${v//h/H};v=${v//i/I};v=${v//j/J};v=${v//k/K};v=${v//l/L};v=${v//m/M};v=${v//n/N};v=${v//o/O};v=${v//p/P};v=${v//q/Q};v=${v//r/R};v=${v//s/S};v=${v//t/T};v=${v//u/U};v=${v//v/V};v=${v//w/W};v=${v//x/X};v=${v//y/Y};v=${v//z/Z};echo "$v";done

लोअरकेस में साधारण बैश:

while read v;do echo "${v,,}"; done

अपरकेस के लिए सरल बैश:

while read v;do echo "${v^^}"; done

ध्यान दें कि $ {v,} और $ {v ^} केवल पहले अक्षर को बदलते हैं।

आपको इसे इस तरह से उपयोग करना चाहिए:

(while read v;do echo "${v,,}"; done) < input_file.txt > output_file.txt


5

मुझे यहाँ कुछ उत्तर पसंद हैं, लेकिन एक सीड कमांड है जिसे किसी भी प्लेटफ़ॉर्म पर ट्रिक करना चाहिए:

sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

वैसे भी, यह समझना आसान है। और y कमांड के बारे में जानना कभी-कभी काम आ सकता है।


2
यह मनमाने ढंग से अंतरराष्ट्रीय पात्रों के लिए काम नहीं करता है, लेकिन OS / X में ASCII वर्णों के लिए काम करता है
emrys57

इसने निश्चित रूप से मेरे लिए काम किया। मुझे यह स्वीकार करना होगा कि मैंने पहली बार y कमांड का इस्तेमाल किया था। धन्यवाद!
मोनसून

4

अगर आप पॉज़िक्स सेड का इस्तेमाल कर रहे हैं

पैटर्न के लिए किसी भी मामले के लिए चयन (खोजे गए पैटर्न को इस सेड के साथ परिवर्तित करने की तुलना में आप बदले हुए पैटर्न का उपयोग करके regex का उपयोग करना चाहते हैं:

echo "${MyOrgPattern} | sed "s/[aA]/[aA]/g;s/[bB]/[bB]/g;s/[cC]/[cC]/g;s/[dD]/[dD]/g;s/[eE]/[eE]/g;s/[fF]/[fF]/g;s/[gG]/[gG]/g;s/[hH]/[hH]/g;s/[iI]/[iI]/g;s/[jJ]/[jJ]/g;s/[kK]/[kK]/g;s/[lL]/[lL]/g;s/[mM]/[mM]/g;s/[nN]/[nN]/g;s/[oO]/[oO]/g;s/[pP]/[pP]/g;s/[qQ]/[qQ]/g;s/[rR]/[rR]/g;s/[sS]/[sS]/g;s/[tT]/[tT]/g;s/[uU]/[uU]/g;s/[vV]/[vV]/g;s/[wW]/[wW]/g;s/[xX]/[xX]/g;s/[yY]/[yY]/g;s/[zZ]/[zZ]/g" | read -c MyNewPattern
 YourInputStreamCommand | egrep "${MyNewPattern}"

निचले मामले में परिवर्तित करें

sed "s/[aA]/a/g;s/[bB]/b/g;s/[cC]/c/g;s/[dD]/d/g;s/[eE]/e/g;s/[fF]/f/g;s/[gG]/g/g;s/[hH]/h/g;s/[iI]/i/g;s/j/[jJ]/g;s/[kK]/k/g;s/[lL]/l/g;s/[mM]/m/g;s/[nN]/n/g;s/[oO]/o/g;s/[pP]/p/g;s/[qQ]/q/g;s/[rR]/r/g;s/[sS]/s/g;s/[tT]/t/g;s/[uU]/u/g;s/[vV]/v/g;s/[wW]/w/g;s/[xX]/x/g;s/[yY]/y/g;s/[zZ]/z/g"

अपरकेस के लिए समान ही निचले अक्षर को // सेड में ऊपरी बराबर के बीच बदल देता है

मज़े करो


(मैंने पाया कि यह एक MacOS पर सबसे अच्छा काम करता है) - अच्छा, मेरे दोस्त - लेकिन एक छोटे से टोपो - आपके पास Jj मामला पीछे की तरफ है। Sed "s / [aA] / a / g; s / [bB] / b / g; s / [cC] / c / g; s / [dD] / d / g; s / [eE] / के लिए होना चाहिए। ई / जी की / [ff] / च / जी की / [GG] / जी / जी की / [HH] / एच / जी की / [ii] / i / जी की / [जे जे] / j / जी की / [केके] / क / छ की / [जाएगा] / एल / जी की / [मिमी] / मी / जी की / [एन] / एन / जी की / [ऊ] / ओ / जी की / [पीपी] / p / जी की / [QQ] / q / जी की / [आरआर] / आर / जी की / [ss] / एस / जी की / [tt] / टी / जी की / [uU] / u / जी की / [वी.वी.] / v / जी की / [ww] / डब्ल्यू / जी की / [xX] / एक्स / जी की / [yy] / y / g; s / [zZ] / z / g "
नील मैकगिल

मुझे यकीन नहीं है कि आपको श्रम की गहनता से कुछ करने की आवश्यकता क्यों है। मैं मान रहा हूं कि मैक ओएस में GNU एक्सटेंशन नहीं हैं, लेकिन यदि आप प्रतिस्थापन के बजाय ('s') सेड का उपयोग करने पर मर चुके हैं, तो आप लिप्यंतरण ('y') का उपयोग कर सकते हैं, जैसे: sed 'y / ABCDEFGHIJKLLNOPQRSTUVWXYZ / abcdefghijklmnopqrstuvwxyvxyxyvxyz / '
Luv2code

लक्ष्य किसी भी पाठ पैटर्न का चयन करना था जो डेटा स्रोत की सामग्री को बदलने के बिना एक गैर GNU sed से निचले / ऊपरी मामले की तरह दिखता है (स्रोत y//की सामग्री को बदलने या पैटर्न खोज को याद कर सकता है।
NeronLeVelu

3

छोटा, मीठा और आपको पुनर्निर्देशन की आवश्यकता नहीं है :-)

perl -p -i -e 'tr/A-Z/a-z/' file

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