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!
ikrabbe

Відповіді:


11

З GNU sed:

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

Буде використовувати велику літери третьої послідовності літер з кожного рядка.

Щоб використовувати великі літери у кожній третій послідовності літер у кожному рядку:

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

Використовуйте великі літери кожної третьої послідовності літер у вхідному тексті за допомогою GNU 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:]]клас символів може бути дещо випадковим у деяких системах (наприклад, у системах GNU, що включає багато цифр за винятком арабських (0123456789)), Perl \p{...}заснований на властивостях символів Unicode. Таким чином, \p{alpha}вони включатимуть букви в усіх алфавітах, а також небуквені алфавітні символи.

Він не включатиме поєднання діакритики, хоча це означає, що такі слова, як, наприклад Stéphane, вважатимуться двома окремими словами.

Тому ви можете замість цього:

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

Хоча це може закінчитися, включаючи занадто багато.

Також зауважте, що всупереч GNU sed, Perl \uправильно трансформує такі слова, як fiddle(де один символ лігатури), у Fiddle(2 символи Fта i).


3

перл

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

Він налічує 2 послідовності знаків, що закінчуються підкресленням, а потім великі регістри наступного знака.


2

Ще один GNU sed:

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

Це передбачає, що рядок завжди починається зі слова.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.