Se houver mais de um ponto, mas apenas um ponto após o sinal @ (o que seria normal), você poderá alterar todos os pontos e alterar o último ponto de volta:
sed 'y/./^/;s/\(@.*\)\^/./'
Se houver mais de um ponto antes e depois do sinal @, você poderá fazer isso recursivamente com um loop curto:
sed ':top;s/\.\(.*@\)/^/;ttop'
Isso funciona no GNU sed; O BSD sed requer uma nova linha após um rótulo:
sed ':top
s/\.\(.*@\)/^/;ttop'
EDIT: Para lidar com todos os casos no sed GNU ou no BSD sed em um único comando de linha:
sed 'h;s/@.*//;y/./^/;G;s/\n.*@/@/'
h copia a linha atual (chamada de "espaço de padrão") para o espaço de espera; o comando s exclui o @ e tudo depois dele; y funciona como o comando shell tr e, nesse caso, converte todos os pontos em carets; G acrescenta uma nova linha e o conteúdo do espaço de espera ao espaço padrão; em seguida, o último comando s excluirá da nova linha até o @ e retornará o @ .