Você pode usar sponge
, conforme mencionado em Um programa que pode armazenar em buffer stdin ou arquivo . Você pode canalizar todo o loop para ele, da mesma forma que a entrada é redirecionada para ele:
while read -r line ; do
echo "$line" | sed -r 's/\</\n/g' | sort | tr '\n' ' ' ;
echo
done < filename | sponge filename
Com o Perl, o mesmo poderia ser feito com isso (a quantidade de espaço em branco é diferente):
perl -Mlocale -i -lne 'print join " ", sort split/(?<=\.)| /' filename