[^http] não é nada, exceto http . Essa RE corresponde a um caractere, desde que não seja h nem t nem p . Portanto, href="[^http] corresponde a href="b em href="blah" , mas não href="t em href="toto" .
Aqui, você gostaria de algo como:
sed -E 's@(href=")([^h]|h([^t]|t([^t]|t([^p]|$)|$)|$)|$)@/@g'
Isso é href=" seguido por não- h (um caractere diferente de h ) ou h -não- t ou ht -não t ou htt -não- p ou htt -EOL ou ht -EOL ou h -EOL ou EOL. (EOL == "fim da linha", os 4 últimos que não podem ser encontrados na entrada, pois isso significaria que o " não é correspondido).
(assumindo que seu sed suporta a opção -E ainda não padrão).
Você também pode adicionar / , mas removê-lo depois, quando em href="/http :
sed 's@href="@&/@g;s@href="/http@href="http@g'
Ou com perl :
perl -pe 's|href="\K(?!http)|/|g'
Usando o operador RE de look-ahead negativo de perl .