Por palavra quero dizer "uma sequência de caracteres separados por qualquer número de espaços em branco ou novas linhas".
Dados de amostra
on a rabbit's burrowing in the forest:
a short tale
Resultados esperados
On a Rabbit's Burrowing in the Forest:
A Short Tale
Nota: Para maiúsculas e minúsculas do título, a primeira letra de cada palavra de cada frase/frase deve ser maiúscula. Cada palavra depois disso deve começar com maiúscula, exceto as palavras minúsculas a , in , the . Também quero que os espaços em branco e as novas linhas sejam preservados.
Caso de teste reduzido
declare -a input
declare -a output
shopt -s extglob
IFS=
read -r -d '' input
for w in "${input[@]}"; do
if [[ $w = "@(a|in|the)" ]]; then
output+=( "$w" )
else
output+=( "${w@u}" )
fi
done
echo "${output[@]}"
Isso preserva espaços em branco e novas linhas, mas transforma apenas a primeira "palavra", enquanto eu gostaria que todas as palavras, exceto a , in e transformadas .
Para processamento de texto, use um utilitário de processamento de texto, não um loop bash . Para colocar o título na primeira sequência de espaços não em branco em uma linha e em todos aqueles que não sejam
a
,the
ein
, você pode usarperl
:Se a entrada puder conter caracteres não ASCII e eles forem codificados em UTF-8, adicione a
-C
opção.Por exemplo:
(observe o caractere
fi
(U+FB01
LATIN SMALL LIGATURE FI ) acima, que não éf
seguido pori
)O que mostra como fazer o correto
ucfirst
não é a mesma coisa que converter o primeiro caractere para maiúsculo.Se eu tivesse que usar um shell, preferiria usar o zsh:
Acho que é cerca de 14 vezes mais lento que o perl no meu sistema e não lida com isso
fi
corretamente. No entanto, ele respeita a localidade ao decodificar a entrada em texto e convertê-la para maiúsculas.Observe que zsh tem um operador de maiúsculas e minúsculas (
${(C)var}
), mas ele não se transformaria apenasfoo-BAR-baz
emFoo-Bar-Baz
letras maiúsculas no primeiro caractere de sequências de caracteres que não são espaços em branco (Foo-BAR-baz
aqui).Premissas:
De qualquer forma, você precisa atualizar sua pergunta para esclarecer, mas isso pode ajudá-lo a conseguir o que deseja.