[^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
.