
Necesito eliminar la siguiente <li>
etiqueta html en muchas páginas index.html.
<li>
<a href="https://forward.global.ssl.fastly.net/contributoragreements/" onclick="_gaq.push(['_trackEvent', 'ClickTracking', 'TopNav_Contact_Editorial', window.location.href]);">Editorial</a>
</li>
Necesito eliminar esto de forma recursiva en muchos archivos. Entonces supongo que usar expresiones regulares en sed en Linux es la mejor opción. Lo intenté de muchas maneras pero no pude encontrar una solución. Hay otras <li>
etiquetas dentro del archivo index.html pero no deben editarse de ninguna manera. Sólo se debe eliminar la etiqueta mencionada anteriormente.
Muchas gracias de antemano.
Respuesta1
Suponiendo que el fragmento del documento es parte de un archivo XHTML bien formado, puede eliminar todos li
los nodos que contengan un a
nodo con un href
atributo cuyo valor sea exactamente https://forward.global.ssl.fastly.net/contributoragreements/
el siguiente xmlstarlet
:
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]' file.xhtml
Si el documento no es un documento XHTML bien formado, puedes intentar recuperarlo primero:
xmlstarlet fo --recover --html file.html |
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]'
Para ejecutar esto en todos index.html
los archivos en una estructura de directorios podrida en top-dir
, llame xmlstarlet
desde find
así:
find top-dir -type f -name index.html -exec sh -c '
tmpfile=$(mktemp)
for pathname do
cp "$pathname" "$tmpfile"
xmlstarlet fo --recover --html "$tmpfile" |
xmlstarlet ed --delete "//li[a/@href = \"https://forward.global.ssl.fastly.net/contributoragreements/\"]" >"$pathname.new"
done
rm -f "$tmpfile"' sh {} +
Lo anterior crearía un nuevo archivo llamado index.html.new
para cada index.html
archivo encontrado. Debes mirar estos archivos y decidir si se ven bien antes de ejecutarlos con .new
el comando anterior eliminado.
Obviamente deberías ejecutar esto en unCopiarde sus datos respaldados durante la prueba.