फ़ाइल सामग्री को निचले मामले में कनवर्ट करें


85

मेरे पास tempकुछ लोअर-केस और अपर-केस सामग्री के साथ फाइल है।

इनपुट

मेरी tempफ़ाइल की सामग्री :

hi
Jigar
GANDHI
jiga

मैं सभी ऊपरी को निचले में बदलना चाहता हूं ।

आदेश

मैंने निम्नलिखित कमांड की कोशिश की:

sed -e "s/[A-Z]/[a-z]/g" temp

लेकिन गलत आउटपुट मिला।

उत्पादन

मैं इसे चाहता हूं:

hi
jigar
gandhi
jiga

तर्क के स्थानापन्न हिस्से में क्या होना चाहिए sed?


जवाबों:


122

यदि आपके इनपुट में केवल ASCII वर्ण हैं, तो आप इसका उपयोग कर सकते हैं tr:

tr A-Z a-z < input 

या (याद रखना आसान है और IMO टाइप करें; लेकिन ASCII लैटिन अक्षरों तक सीमित नहीं है, हालांकि GNU सहित कुछ कार्यान्वयन में tr, अभी भी सिंगल-बाइट वर्णों तक सीमित है, इसलिए UTF-8 स्थानों में, अभी भी ASCII अक्षरों तक सीमित है):

tr '[:upper:]' '[:lower:]' < input

अगर आपको उपयोग करना है sed:

sed 's/.*/\L&/g' < input

(यहाँ GNU कार्यान्वयन को मानते हुए)।

POSIX के साथ sed, आपको सभी अनुवादों को निर्दिष्ट करने की आवश्यकता होगी और फिर आप चुन सकते हैं कि आप किन अक्षरों को बदलना चाहते हैं:

sed 'y/AǼBCΓDEFGH.../aǽbcγdefgh.../' < input

के साथ awk:

awk '{print tolower($0)}' < input

3
कृपया ध्यान दें कि \LGNU एक्सटेंशन है।
एंथन

\Lमेरे लिए अब तक अच्छा काम करता है।
एनएनयू

2
@JigarGandhi। sedएक यूनिक्स कमांड है। विभिन्न प्रणालियों के अलग-अलग व्यवहार और कार्यक्षमता के साथ अलग-अलग प्रकार हैं। शुक्र है, आजकल, एक मानक है जो सबसे अधिक अनुरूप है इसलिए आप सभी के लिए सामान्य सुविधाओं के न्यूनतम सेट पर भरोसा कर सकते हैं। \Lउनके बीच नहीं है और जीएनयू द्वारा प्रस्तुत किया गया था sed(मानक ex/ में एक ही ऑपरेटर से मेल खाता है vi) और आमतौर पर अन्य कार्यान्वयन में उपलब्ध नहीं है।
स्टीफन चेज़लस

9
ध्यान दें कि बहु-बाइट स्थानों में trGNU जैसे कुछ कार्यान्वयन trठीक से काम नहीं करते हैं (उनमें से अधिकांश आजकल हैं, echo STÉPHANE | tr '[:upper:]' '[:lower:]'उदाहरण के लिए प्रयास करें )। जीएनयू सिस्टम पर, आप पसंद कर सकते हैं sedया प्रकार awkके tolower()
स्टीफन चेज़लस

5
थोड़ा सा सुधार: sed 's/.*/\L&/g' < input\1मिलान किए गए सबस्ट्रिंग का संदर्भ तब तक काम नहीं करेगा जब तक कि आप कोष्ठक के साथ सबस्ट्रिंग निर्दिष्ट नहीं करते हैं जैसा कि कछुए में होता है। हालाँकि, यह &पूरे मैच का प्रतिनिधित्व करने के लिए उपयोग करने के लिए थोड़ा साफ है , जैसा कि दिखाया गया है
एडवर्ड ब्राउन

30

विम का उपयोग करना, यह सुपर सरल है:

$ vim filename
gg0guGZZ

फ़ाइल खोलता है, ggपहली पंक्ति में जाता है 0, पहला कॉलम। साथ guG, फ़ाइल के नीचे तक सभी पात्रों के मामले कम करती है। ZZबचाता है और बाहर निकलता है।

इसे आपके द्वारा फेंके जाने वाले किसी भी चीज़ के बारे में संभालना चाहिए; यह संख्याओं को अनदेखा कर देगा, यह गैर ASCII संभाल लेगा।

यदि आप इसके विपरीत करना चाहते हैं, तो कम केस वाले अक्षरों को ऊपरी स्थिति में बदल दें, uएक के लिए बाहर स्वैप करें U: gg0gUGZZऔर आप सेट हैं।


14
लोल "सुपर सिंपल"
ब्लेमबर्ट

यह स्पष्ट रूप से कई फाइलों के लिए अच्छा नहीं है
कोरी गोल्डबर्ग

मेरा सबसे पसंदीदा जवाब इस प्रकार अब तक !!!!
मोना जलाल

1
@CoreyGoldberg vim file1 file2 fileetcकी तरह और फिर कुछ :bufdo gg0guG:w<CR>होता शायद फ़ाइलों के किसी भी संख्या के लिए काम करते हैं। कि हालांकि परीक्षण नहीं किया है!
टैंकरस्मैश

@TankorSmash जो अब भी बड़ी संख्या में फ़ाइलों को स्केल नहीं करता है
कोरी गोल्डबर्ग

17

मैं इसके ddलिए खुद को पसंद करता हूं।

<<\IN LC_ALL=C 2<>/dev/null \
dd conv=lcase
hi
Jigar 
GANDHI
jiga
IN

... हो जाता है ...

hi
jigar
ghandi
jiga

LC_ALL=Cइनपुट में किसी भी multibytes रक्षा के लिए है - हालांकि किसी भी multibyte राजधानियों परिवर्तित नहीं किया जाएगा। जीएनयू (जीएनयू) के लिए भी यही बात लागू होती है tr- दोनों ऐप किसी भी गैर-सी लोकेल में इनपुट मैनबलिंग से ग्रस्त हैं। iconvएक व्यापक समाधान के लिए दोनों के साथ जोड़ा जा सकता है।

2>/dev/nullरीडायरेक्ट छोड देता ddहै डिफ़ॉल्ट स्थिति रिपोर्ट - और उसके stderr। इसके बिना ddउपरोक्त w / मुद्रण जानकारी जैसे कि कितने बाइट्स संसाधित किए गए और आदि जैसे किसी कार्य को पूरा करना होगा।


यह समाधान trबड़ी फ़ाइलों को संभालते समय की तुलना में तेज़ है , धन्यवाद!
व्हाइटविंटरवुल्फ़

13

आप पर्ल 5 का भी उपयोग कर सकते हैं:

perl -pe '$_=lc' temp

विकल्प -p, इनपुट की प्रत्येक पंक्ति के लिए एक बार निर्दिष्ट अभिव्यक्ति को चलाने के लिए पर्ल को बताता है, परिणाम को प्रिंट करता है, अर्थात का अंतिम मूल्य $_-eइंगित करता है कि स्क्रिप्ट के साथ फ़ाइल के विपरीत कार्यक्रम अगला तर्क होगा। lcलोअरकेस में कनवर्ट करता है। एक तर्क के बिना, यह काम करेगा $_। और $_=बचाता है कि फिर से यह मुद्रित हो जाएगा।

इसका एक रूपांतर होगा

perl -ne 'print lc' temp

का उपयोग करना -nपसंद है -pसिवाय इसके कि $_अंत में मुद्रित नहीं होगा। इसलिए उस चर को बचाने के बजाय, मैं एक स्पष्ट प्रिंट स्टेटमेंट सहित हूं।

Sed के विपरीत Perl का एक लाभ यह है कि आपको किसी भी GNU एक्सटेंशन की आवश्यकता नहीं है। ऐसी परियोजनाएं हैं जिन्हें गैर-जीएनयू वातावरण के साथ संगत होना है, लेकिन जिनके पास पहले से ही पर्ल एएसए निर्भरता है। की तुलना में tr, यह हो सकता है कि पर्ल lcको आसानी से स्थानीय-जागरूक बनाया जा सकता है। देखें perllocaleविवरण के लिए आदमी पेज।


9

आपको मिलान किए गए पैटर्न पर कब्जा करने की आवश्यकता है और फिर एक संशोधक के साथ प्रतिस्थापन में इसका उपयोग करें:

sed 's/\([A-Z]\)/\L\1/g' temp

\(...\)"कब्जा" संलग्न मिलान वाला पाठ, पहले कब्जा करने के लिए चला जाता है \1, के लिए अगले \2नंबरिंग अनुसार है, आदि नेस्टेड कैप्चर के मामले में कोष्ठक खोलने के लिए।

\Lधर्मान्तरित को लोअर केस में कब्जा कर लिया पैटर्न, वहाँ भी है \Uऊपरी मामले के लिए।


3
आपको यह करने की आवश्यकता नहीं है - पूरे पैटर्न को हमेशा &
mikeserv

यह सच है, लेकिन तब मुझे मैचों को कैप्चर करने का मौका देने की याद आती थी :-)
wurtel

1

MvG के जवाब के आगे, आप पर्ल 6 का भी उपयोग कर सकते हैं:

perl6 -pe .=lc temp

यहाँ $ _ निहित है, और आपको शेल द्वारा विस्तार से बचाने के लिए एकल उद्धरणों की आवश्यकता नहीं है ($ _ एक विशेष बैश पैरामीटर है; देखें: https://www.gnu.org/software/bash/manual/ html_node / विशेष- Parameters.html )

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