sed - कैसे हर 3 शब्द को कैपिटलाइज़ करें?


9

दिया हुआ:

main_east_library
main_west_roof
main_north_roof
minor_south_roof

मैं कैसे इस्तेमाल किया जा सकता sed(विशेष रूप से, नहीं awk, tr, आदि) बनाने के लिए:

main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof

कुछ इस तरह:

$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_' 

हालांकि यह देता है:

sed: -e expression #1, char 16: Invalid back reference

1
जाग या ट्र के बिना आपकी तलछट विफल हो जाएगी यदि आप इसे विरासत या सिर्फ अन्य प्रणाली पर आजमाते हैं। उत्तर में कुछ भाव GNU एक्सटेंशन हैं!
.रबबे

जवाबों:


11

GNU के साथ sed:

sed -E 's/[[:alpha:]]+/\u&/3'

प्रत्येक पंक्ति से अक्षरों के तीसरे क्रम को बड़ा करेंगे।

प्रत्येक पंक्ति में अक्षरों के हर तीसरे क्रम को भुनाने के लिए :

sed -E 's/(([[:alpha:]]+[^[:alpha:]]+){2})([[:alpha:]]+)/\1\u\3/g'

जीएनयू के साथ पूरे इनपुट में अक्षरों के हर तीसरे अनुक्रम को कैपिटल करने के लिए awk:

awk -v RS='[^[:alpha:]]+' -v ORS= '
   NR % 3 == 0 {$0=toupper(substr($0,1,1)) substr($0,2)}
   {print $0 RT}'

या साथ perl:

perl -Mopen=locale -pe 's/\p{alpha}+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

हालांकि [[:alpha:]]वर्ण वर्ग कुछ प्रणालियों (जीएनयू सिस्टम पर उदाहरण के लिए, जो कि अरबी के अपवर्जन के साथ कई अंक शामिल हैं) (0123456789) पर थोड़ा यादृच्छिक हो सकता है, पर्ल \p{...}यूनिकोड वर्ण गुणों पर आधारित है। तो उन \p{alpha}सभी अक्षर में अक्षर शामिल होंगे और गैर-अक्षर वर्णमाला भी।

इसमें डायक्ट्रीक्स का संयोजन शामिल नहीं होगा, जिसका अर्थ है कि जैसे शब्दों Stéphaneको दो अलग-अलग शब्दों के रूप में माना जाएगा।

तो आप इसके बजाय चाहते हो सकता है:

perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

हालांकि यह भी कई सहित अंत हो सकता है।

यह भी ध्यान दें कि GNU के विपरीत sed, पर्ल (2 अक्षरों और ) के लिए पर्ल (जहां एक लिगचर कैरेक्टर है) \uजैसे शब्दों को सही ढंग से बदल देगा ।fiddleFiddleFi


3

पर्ल

perl -pe 's/(?:.*?_){2}\K./\u$&/'

यह अंडरस्कोर के साथ समाप्त होने वाले वर्णों के 2 अनुक्रमों को गिनता है, फिर अगले चार्ट को अपरकेस करता है।


2

एक और GNU sed:

sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'

यह मानता है कि लाइन हमेशा एक शब्द से शुरू होती है।

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