Encontre e substitua ou remova HTMLtag usando sed no Linux

Encontre e substitua ou remova HTMLtag usando sed no Linux

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 lios nós que contenham um anó com um hrefatributo 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.htmlos arquivos em uma estrutura de diretórios podres em top-dir, chame xmlstarletassim 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.newpara cada index.htmlarquivo encontrado. Você deve examinar esses arquivos e decidir se eles parecem ok antes de executar .newo comando removido acima.

Você obviamente deve executar isso em umcópia dedos seus dados de backup durante o teste.

informação relacionada