Remove os blocos div que correspondem a uma string de um enorme arquivo html

0

Estou no Mac e quero remover vários blocos <div> de um arquivo html que corresponda a uma determinada string. Eu tentei usar sed para isso da seguinte maneira, mas falhei:

  1. Primeiro escapei de todos os símbolos no meu STRING que têm significado especial de regex e produzi ESCAPEDSTRING

  2. Mas agora estou lutando para encontrar uma ferramenta que trabalhe em várias linhas e com regex para remover as respectivas linhas. Eu acho que sed não funciona.

No exemplo a seguir, desejo remover qualquer bloco <div> que contenha a string GET /thestring//index.php , enquanto todo o resto (isto é, o segundo ao último bloco contendo GET /thisisatotallydifferentstring ) permanece parte do arquivo html. Um exemplo de foo.html se parece com isto:

<div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&amp;session_id=1523141136.42&amp;data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2000976405029%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e21%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e000035010005%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 339 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&amp;session_id=1523141136.42&amp;data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2001021500003%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e1%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e501302462%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 349 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:50:17 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&amp;session_id=3214235353.32&amp;onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:50:18 +0200] "GET /thestring//index.php?fnc=OSCConfirmCatalog&amp;session_id=3214235353.32&amp;date= HTTP/1.1" 200 249 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:50:28 +0200] "GET /thestring//index.php?fnc=OSCExportOrder&amp;session_id=3214123353.99 HTTP/1.1" 200 278 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:55:18 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&amp;session_id=1523141718.15&amp;onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:55:19 +0200] "GET /thestring//index.php?fnc=OSCConfirmCatalog&amp;session_id=1523141718.15&amp;date= HTTP/1.1" 200 249 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:55:29 +0200] "GET /thestring//index.php?fnc=OSCExportOrder&amp;session_id=1523141729.64 HTTP/1.1" 200 278 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:01:00:27 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&amp;session_id=1523142027.44&amp;onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:01:00:28 +0200] "GET /thestring//index.php?fnc=OSCConfirmCatalog&amp;session_id=1523142027.44&amp;date= HTTP/1.1" 200 249 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:01:00:38 +0200] "GET /thestring//index.php?fnc=OSCExportOrder&amp;session_id=1523142038.38 HTTP/1.1" 200 278 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects setter usage and property overloading</span><br>
 <span class="line"><b>Log line: </b>222.333.444.555 - - [03/Jan/2013:01:03:42 +0200] "GET /thisisatotallydifferentstring.html HTTP/1.1" 301 - "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:01:05:27 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&amp;session_id=1523142327.08&amp;onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
 </div>

Gostaria de remover todos os blocos <div></div> que contenham 'thestring'.

Meu regex é assim:

\<div class\="block highlight"\>\n  Reason\: \<span class\="reason"\>Detects JavaScript location/document property access and window access obfuscation\</span\>\<br\>\n \<span class\="line"\>\<b\>Log line\: .* \- \- \[08/Apr/2018\:.*\] "GET /pixi//index\.php.* HTTP/1\.1" 200 .* "\-" "\-"\n\</span\>\<br\>\n \</div\>\n

Alguma sugestão?

    
por user1192748 11.04.2018 / 11:14

1 resposta

0

Use o programa xsltproc que você terá no OSX, man xsltproc

Por exemplo:

$ cat remdivs.xslt 
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output method="html" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="html body div" />

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
 </xsl:template>

 <xsl:template match="div[@class='block highlight']"/>

 </xsl:stylesheet>



$ cat input.xml 
<html>
<div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&amp;session_id=1523141136.42&amp;data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2000976405029%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e21%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e000035010005%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 339 "-" "-"
</span><br>
 </div>
 <div class="no highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&amp;session_id=1523141136.42&amp;data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2001021500003%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e1%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e501302462%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 349 "-" "-"
</span><br>
 </div>
 <div class="block highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:50:17 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&amp;session_id=3214235353.32&amp;onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
 </div>
</html>

$ xsltproc --html remdivs.xslt input.xml
<html>
<body>
 <div class="no highlight">
  Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
 <span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&amp;session_id=1523141136.42&amp;data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2001021500003%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e1%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e501302462%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 349 "-" "-"
</span><br>
 </div>

</body>
</html>

edite depois de mais explicações sobre o problema.

Mais explicações.

xsltproc realiza a transformação do documento de entrada com base no modelo (remdivs.xslt), eu uso a opção --html para relaxar a validação xml rígida, pois o documento de entrada contém <br> empty elements (em oposição a <br/> ).

O processador primeiro pega seu documento de entrada e constrói um modelo de documento na memória, depois percorre os elementos no modelo aplicando os modelos encontrados no .xslt

Olhando para o .xslt , ele contém a declaração de preâmbulo e, em seguida, algumas regras gerais de processamento que ajudam a definir o tipo de saída necessária.

Existem apenas dois modelos, o primeiro

<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
 </xsl:template>

Este modelo tem um atributo match , portanto, ele é aplicado somente aos elementos no documento de entrada que correspondem à expressão de correspondência. Nesse caso, a expressão é "@* | node()" , que corresponderá a qualquer atributo ou a qualquer nó em seu documento, a coisa toda! O que ele faz para esses elementos é apresentado por dentro, ele copia a saída da aplicação de cada modelo seletivamente, mas os modelos de critérios de seleção serão o nome de cada atributo e elemento. O efeito é que, se apenas este modelo estivesse presente, seria uma cópia do seu documento de entrada original, com as regras de processamento de saída aplicadas.

O segundo modelo faz a rejeição.

 <xsl:template match="div[@class='block highlight']"/>

Aqui, ele corresponde especificamente a <div> elements que possuem um atributo chamado class , com um valor de 'block highlight' . então, aqueles <div>...</div> blocos onde isto corresponde, são substituídos pela saída que este modelo produz, seno este está vazio (tem uma finalização / ), nenhuma saída é produzida.

Isso, por outro lado,

 <xsl:template match="div[@class='block highlight']">
    suppressed div output<br>
 </xsl:template>

Produzirá algum texto no lugar do bloco div suprimido.

Veja um modelo de supressão diferente com base na sua pergunta revisada.

<xsl:template match="div">
   <xsl:choose>
       <xsl:when test="not(contains(span[@class='line'],'GET /thestring'))">
           <xsl:copy>
               <xsl:apply-templates select="@* | node()"/>
           </xsl:copy>
       </xsl:when>
       <xsl:otherwise><!-- Just do nothing to supress output -->
       </xsl:otherwise>
   </xsl:choose>
</xsl:template>

Este modelo é aplicado a todos os elementos div. Ele testa se o conteúdo de texto de qualquer um de seus elementos de span filho, que também contém o valor do atributo class de line , não contém a string 'GET / thestring' '.

Quando não contém a string, fazemos o mesmo tipo de cópia que no primeiro modelo, caso contrário, não fazemos nada para suprimir a saída desse bloco div.

Leia mais sobre o XPath, que define como endereçar os elementos e atributos de um documento e o XSLT para escrever modelos de processamento; esses exemplos devem ajudar a torná-lo mais claro para o iniciante.

    
por 11.04.2018 / 16:46