Sed replace partes de líneas que no comiencen con http: //

Me estoy quedando atrapado con sed … Estoy intentando ponerle un prefijo a los enlaces en un file html con un / cuando no empiecen con http … Sé que posiblemente esta no sea la mejor manera de hacerlo, pero Estoy justo después de una simple solución rápida.

Hasta ahora, he intentado esto (nota IRL Usaré la bandera -i in place, etc. Esto es solo para probar):

echo '<a href="egww">blah</a><a href="http://bloge.weg">yeah</a>' | sed 's@href="[^http]@href="/@g' 

Esto casi funciona:

 <a href="/gww">blah</a><a href="http://bloge.weg">yeah</a> 

Excepto que el primer carácter del primer enlace se cortó, también creo que no se corresponde en h, t, t o p en lugar de la cadena entera http:

 echo '<a href="egww">blah</a><a href="p/bloge.weg">damn</a>' | sed 's@href="[^http]@href="/@g' <a href="/gww">blah</a><a href="p/bloge.weg">damn</a> 

Estoy bastante perplejo en este momento, desafortunadamente Google no ayuda mucho aquí ya que la negación con sed se usa generalmente para eliminar líneas que contienen una cadena en lugar de no hacer coincidir subcadenas en líneas … Intenté varios patrones regulares de expresiones regulares pero estos no parece funcionar

¿Algunas ideas?

[^http] no es nada más que http . Esa RE coincide con un personaje, siempre que no sea h , ni t , ni p . Entonces href="[^http] coincide con href="b en href="blah" , pero no href="t en href="toto" .

Aquí, querrás algo como:

 sed -E 's@(href=")([^h]|h([^t]|t([^t]|t([^p]|$)|$)|$)|$)@\1/\2@g' 

Eso es href=" seguido por not- h (un caracter distinto de h ), o h -not- t , o ht -not- t , o htt -not- p , o htt -EOL, o ht -EOL o h -EOL o EOL. (EOL == "fin de línea", los últimos 4 que probablemente no se encuentren en la input significa que " no coincide").

(suponiendo que su sed soporte la opción -E aún no estándar).

También puede agregar / siempre pero eliminarlo cuando esté en href="/http :

 sed 's@href="@&/@g;s@href="/http@href="http@g' 

O con perl :

 perl -pe 's|href="\K(?!http)|/|g' 

Usando el operador de RE de mirada negativa de perl .