Você pode fazer assim:
sed -e's/ \([^ ][^ ]\)/\n/g' \
-e's/\([^ ][^ ]\) /\n/g' \
-e's/ //g;y/\n/ /
' <<\IN
I have a source text file containing text where
some words are l e t t e r s p a c e d
like the word "letterspaced" in this question
(i.e., there is a space character between the
letters of the word.
IN
A idéia é primeiro encontrar todos os espaços que são precedidos ou seguidos por dois ou mais caracteres não-espaciais e os separam como caracteres de nova linha. Em seguida, basta remover todos os espaços restantes. E por último, traduza todas as novas linhas de volta para espaços.
Isso não é perfeito - sem incorporar um dicionário inteiro de cada palavra que você poderia usar, o melhor que você obterá é algum tipo de heurística. Este é muito bom, apesar de tudo.
Além disso, dependendo do sed
que você usa, talvez seja necessário usar uma nova linha literal no lugar do n
que também uso nas duas primeiras instruções de substituição.
Afora essa ressalva, no entanto, isso funcionará - e funcionará muito rápido - com qualquer POSIX sed
. Ele não precisa fazer qualquer lookaheads ou behinds caros, porque ele simplesmente salva impossibles, o que significa que ele pode manipular todo o espaço padrão para cada substituição em um único endereço.
OUTPUT
I have a source text file containing text where some
words are letterspaced
like the word "letterspaced" in this question
(i.e., there is a space character between the
letters of the word.