
Preciso remover a seguinte <li>
tag html em muitas 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>
Preciso remover isso recursivamente em muitos arquivos. Então acho que usar regex no sed no Linux é a melhor opção. Tentei de várias maneiras, mas não consegui encontrar uma solução. Existem outras <li>
tags dentro do arquivo index.html, mas elas não devem ser editadas de forma alguma. Apenas a tag mencionada acima deve ser removida.
Muito obrigado antecipadamente.
Responder1
Supondo que o fragmento do documento faça parte de um arquivo XHTML bem formado, você pode excluir todos li
os nós que contenham um a
nó com um href
atributo cujo valor seja exatamente https://forward.global.ssl.fastly.net/contributoragreements/
usando xmlstarlet
:
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]' file.xhtml
Se o documento não for um documento XHTML bem formado, você poderá tentar recuperá-lo primeiro:
xmlstarlet fo --recover --html file.html |
xmlstarlet ed --delete '//li[a/@href = "https://forward.global.ssl.fastly.net/contributoragreements/"]'
Para executar isso em todos index.html
os arquivos em uma estrutura de diretórios podres em top-dir
, chame xmlstarlet
assim find
:
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 {} +
O acima criaria um novo arquivo chamado index.html.new
para cada index.html
arquivo encontrado. Você deve examinar esses arquivos e decidir se eles parecem ok antes de executar .new
o comando removido acima.
Você obviamente deve executar isso em umcópia dedos seus dados de backup durante o teste.