Редактировать:
Вот gawk
версия:
gawk -F_ '{for (i=1;i<=NF;i++) printf "%s%s",substr($i,1,1),tolower(substr($i,2)); printf "\n"}'
Оригинал:
Использование sed
это довольно страшно:
sed -r 'h;s/(^|_)./\n/g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;x;s/((^|_)(.))[^_]*/\3\n/g;G;:a;s/(^.*)([^\n])\n\n(.*)\n([^\n]*)$/\1\n\2\4\3/;ta;s/\n//g'
Здесь это разбито:
# make a copy in hold space
h;
# replace all the characters which will remain upper case with newlines
s/(^|_)./\n/g;
# lowercase all the remaining characters
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;
# swap the copy into pattern space and the lowercase characters into hold space
x;
# discard all but the characters which will remain upper case
s/((^|_)(.))[^_]*/\3\n/g;
# append the lower case characters to the end of pattern space
G;
# top of the loop
:a;
# shuffle the lower case characters back into their proper positions (see below)
s/(^.*)([^\n])\n\n(.*)\n([^\n]*)$/\1\n\2\4\3/;
# if a replacement was made, branch to the top of the loop
ta;
# remove all the newlines
s/\n//g
Вот как работает тасование:
Во время запуска, этоВот как выглядит шаблонное пространство:
A
D
G
bc
ef
hi
Перемешивающий цикл выбирает строку, которая находится между последней новой строкой и концом, и перемещает ее в позицию перед двумя последовательными новыми строками (фактически тремя) и перемещает дополнительнуюсимвол новой строки, поэтому перед символом он следовал ранее.
После первого шага в цикле вот как выглядит шаблонное пространство:
A
D
Ghi
bc
ef
И обработка продолжается аналогично, пока ничего не произойдет додополнительная новая строка, в которой совпадение завершается неудачно, а ветвление цикла не берется.
Если вы хотите использовать в качестве заглавия последовательность слов, разделенных пробелами, сценарий будет похож:
$ echo 'BEST MOVIE THIS YEAR' | sed -r 'h;s/(^| )./\n/g;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;x;s/((^| ).)[^ ]*/\1\n/g;G;:a;s/(^.*)( [^\n]*)\n\n(.*)\n([^\n]*)$/\1\n\2\4\3/;ta;s/^([^\n]*)(.*)\n([^\n]*)$/\1\3\2/;s/\n//g'
Best Movie This Year