Se você estiver executando o Linux e tiver o GNU Sed, poderá usar o sinalizador g
juntamente com um número para o comando s
ubstitute:
sed -r 's/ +/ /g2' file.txt
Para citar info sed
:
Note: the POSIX standard does not specify what should happen when
you mix the 'g' and NUMBER modifiers, and currently there is no
widely agreed upon meaning across 'sed' implementations. For GNU
'sed', the interaction is defined to be: ignore matches before the
NUMBERth, and then match and replace all matches from the NUMBERth
on.
Mas como em um caso você quer fazer a substituição na primeira instância de um espaço (quando não há espaços à esquerda), a resposta completa (com o GNU Sed) é:
sed -r 's/^/ /;s/ +/ /g2;s/^ //' file.txt
Em outras palavras, adicione um espaço inicial a todas as linhas, depois "esprema" todas as instâncias de espaços consecutivos, exceto a primeira, e remova o espaço inicial adicionado.
Se os espaços iniciais forem sempre um múltiplo de 8, você poderá usar o seguinte comando compatível com POSIX:
unexpand file.txt | sed 's/ */ /g' | expand
Ou mais simplesmente:
unexpand file.txt | tr -s ' ' | expand