Shellscript para remover tags específicas no arquivo HTML

2

Alguém pode me orientar a escrever o comando Shell Script para o seguinte cenário.

Eu tenho um arquivo html com todas as tags em uma única linha como essa,

<html><head></head><body><br><center><h2 style='display: block;font-size: 1.5em;weight: bold;'>Validation Report</h2></center></body><table style='border:1px solid;border-collapse: separate;border-spacing: 2px;border-color: gray;' align='center'width='85%' cellpadding ='4' cellspacing='1' bgcolor='#CFCFCF' ><tr style='background-color:#a6caf0;height:30px;font-size:12px;'><th style='width:467px;border: 1px solid;'>TestCaseID</th><th style='border: 1px solid;'>Severity</th><th style='width:125px;border: 1px solid;'>Result</th><th style='width:148px;border: 1px solid;'>Remark</th><tr style='background-color:#ebf3fc;' align='center'><td style='width:360px;border: 1px solid;'>TESTCASE-001</td><td style='width:360px;border: 1px solid;'>Critical</td><td style='width:125px;border: 1px solid;'>Error</td><td style='width:125px;border: 1px solid;'>None</td></tr><tr style='background-color:#ebf3fc;' align='center'><td style='width:360px;border: 1px solid;'>TESTCASE-002</td><td style='width:360px;border: 1px solid;'>Critical</td><td style='width:125px;border: 1px solid;'>Error</td><td style='width:125px;border: 1px solid;'>None</td></tr></table></body></html>

Este arquivo, quando visualizado em um navegador, terá uma aparência de tabela com entradas de ID de teste, sua Gravidade correspondente, Resultado e Observação. Este arquivo HTML tem um total de 210 TestcaseIDs. Agora eu tenho que remover linhas particulares em uma tabela, mencionando seu TestcaseID. (Diga, eu preciso remover uma linha que tem TESTCASE-002)

    
por Thiripu 22.10.2015 / 11:38

3 respostas

2

Você pode remover a tag com Transformações XSL (XSLT).

A maioria das distros deve vir com um comando xsltproc (parte do pacote libxslt ).

Aqui está o comando para realizar a transformação, que pode ser usada em um shellscript:

xsltproc --html main.xslt index.html

E aqui está o XSLT que removerá TESTCASE-002 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="tr[td = 'TESTCASE-002']"/>
</xsl:stylesheet>

A vantagem dessa abordagem é que ela é declarativa, reutilizável e separa o código que lida com XML / HTML do resto do script de shell. Também é flexível e poderoso. A desvantagem é que é ligeiramente verbosa e incômoda.

Esse método também pode manipular HTML que não está bem formado.

    
por 22.10.2015 / 12:43
8

Em vez de uma ferramenta de processamento de texto como sed / grep, use uma ferramenta que entenda HTML.

Por exemplo, em xsh , você pode

open :F html file.html ;
delete //tr[td='TESTCASE-002'] ;
save :b ;

Você precisa consertar o arquivo primeiro - remova os </body> e </head> endtags perdidos.

    
por 22.10.2015 / 12:03
-1

Esta string irá puxar a primeira entrada no seu bloco html

awk -F"TESTCASE-" '{print $2}' test.html |sed -e 's/<[^>]*>/ /g'

E isso vai tirar o segundo

awk -F"TESTCASE-" '{print $3}' test.html |sed -e 's/<[^>]*>/ /g'

Se você usar a opção -v com awk, você pode passar uma variável bash e extrair qualquer bloco que precisar.

    
por 22.10.2015 / 13:09