. é um metacaractere de expressão regular em sed , que corresponde a qualquer caractere único. Como você insere o caminho $from diretamente na expressão regular, o . está lá como se você tivesse escrito:
sed "s@.@../pool/@"
você mesmo. Que substitui qualquer caractere único, uma vez, com " ../pool/ " , então tem o efeito de deletar o primeiro caractere e inserir "../pool/" em seu lugar.
Se você executar o comando readlink manualmente, verá que ./ não faz parte do conteúdo do link - seu ls mostra o mesmo.
Você precisará, pelo menos, de um caso especial " . " no seu script, pois ele pode ou não estar presente no conteúdo do link. Uma opção é usar readlink -f no link e . - que lhe dará caminhos absolutos ambos - mas existem opções mais simples se você tiver apenas um caso para lidar.
Se você estiver em bash , pode sair sem sed usando expansão básica de parâmetro :
ln -sf "${a/$from/$to}" "$i"
Isso substituirá a expansão de $from pela expansão de $to em $a , com . tratado literalmente (embora * e outros shell metacaracteres sejam usados - realmente deve ser "${a/"$from"/"$to"}" para evitar isso). Esta é uma maneira mais limpa e simples de fazer isso em geral.