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 @
.