Primeira coisa: não escreva em um arquivo que você está lendo, você provavelmente acabará apagando-o. Use o recurso de edição no local ( -i ).
Em seguida, dentro de aspas duras ( ' ), a substituição de variáveis não funciona, então você precisará fazer outra coisa para obter o $PATH expandido substituído lá.
Por fim, $PATH é muito provável que contenha / caracteres, o que quebraria a sintaxe de substituição de sed , portanto você precisará usar outro separador.
Supondo que seus caminhos nunca contenham ; s, tente (depois de ter feito backup de seu arquivo atual, é claro):
sed -i 's;^PATH=.*;PATH='"$PATH"';' .bashrc
A parte da correspondência da substituição significa: corresponde uma string que começa com ( ^ ) a string PATH= e seguida por qualquer caractere ( . ) qualquer número de vezes ( * ). Ou seja ele corresponderá às linhas que começam com PATH= completamente, mas não às linhas que têm PATH= em algum lugar no meio. O .* é importante porque você quer substituir a linha inteira (tente sem ela para ver o que acontece).
A cotação para obter $PATH substituído dentro da substituição é necessária para considerar casos em que $PATH conteria caracteres em branco.
Demo:
$ foo=bar
$ echo hello | sed -e 's/hello/$foo/'
$foo
vars não são substituídos entre aspas duras. Então você recebe um literal $foo lá. Agora deixe o shell expandi-lo, trazendo-o para fora das citações:
$ foo=bar
$ echo hello | sed -e 's/hello/'$foo'/'
bar
Ok! Mas isso não é seguro:
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'$foo'/'
sed: -e expression #1, char 11: unterminated 's' command
sed recebeu dois argumentos após -e acima: s/hello/bar e baz/ , separadamente. Não é bom. Para corrigir isso, você precisa de um pouco mais de aspas:
$ foo="bar baz"
$ echo hello | sed -e 's/hello/'"$foo"'/'
bar baz
Colocar uma variável de ambiente dentro de " quotes é algo que você deve sempre fazer quando você está passando isso como um argumento para outra coisa, caso contrário (assumindo que $IFS não foi alterado) ele será dividido espaço em branco.