EDIT: Já que há alguma confusão sobre se vim ou sed deve ser usado. Eu ofereço soluções para ambos:
Vim
A seguinte substituição substitui as palavras por minúsculas, exceto a primeira letra. Palavras de uma única letra são convertidas em maiúsculas.
:%s/\<\(\k\)\(\k*\)\>/\u\L/g
\k corresponde a caracteres alfanuméricos e _ . O amplamente utilizado \w é equivalente a [A-Za-z0-9_] e falhará nas letras cirílicas.
Os \< e \> pegam os limites de palavras e os parênteses agrupam a correspondência na primeira letra e o restante, que está sendo recuperado usando e , respectivamente.
Para este padrão funcionar, você precisa configurar o vim para usar o UTF-8.
set encoding=utf-8
Sed
sed 's/\b\([[:alpha:]]\)\([[:alpha:]]*\)\b/\u\L/g' <inputfile>
\b corresponde a limites de palavras em sed , o restante é igual à versão vim . (Testado no GNU sed, as classes de caracteres podem não ser suportadas em todas as versões sed .)