削除する 巨大なHTMLファイルで一致する文字列をブロックする

削除する 巨大なHTMLファイルで一致する文字列をブロックする

<div>私はMacを使用しており、特定の文字列に一致するhtmlファイルから複数のブロックを削除したいと思います。次のようにsedを試しましたが、失敗しました。

  1. STRINGまず、特別な正規表現の意味を持ち、生成されたすべてのシンボルをエスケープしました。ESCAPEDSTRING

  2. しかし、今では、複数の行で作業し、正規表現を使用してその行を削除するツールを見つけるのに苦労しています。私の考えではsedないと思います。

次の例では、<div>文字列を含むすべてのブロックを削除し、他のすべてGET /thestring//index.php(つまり、埋め込まれた最後のブロックから2番目のブロックGET /thisisatotallydifferentstring)をhtmlファイルの一部として保持しようとしています。 foo.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="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>

<div></div>"thestring"を含むすべてのブロックを削除したいです。

私の正規表現は次のとおりです。

\<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

どんな提案がありますか?

ベストアンサー1

xsltprocOSXでプログラムを使用して、man xsltproc

たとえば、

$ 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>

追加の質問の説明の後に編集されました。

追加の説明。

xsltprocは、テンプレート(remdivs.xslt)に基づいて入力文書の変換を実行します。入力文書に<br>空の要素が含まれているので、--htmlオプションを使用して厳密なxml検証を軽減しました<br/>

プロセッサは最初に入力文書をインポートし、メモリに文書モデルを構築し、次に文書で見つかったテンプレートを適用してモデルの要素を繰り返します。.xslt

見てみると.xslt、これにはプリアンブル宣言と必要な出力タイプを定義するのに役立ついくつかの一般的な処理規則が含まれています。

テンプレートは2つだけです。最初のテンプレートは

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

テンプレートにはmatch属性があるため、一致式に一致する入力文書の要素にのみ適用されます。この場合、"@* | node()"ドキュメントのすべての属性またはノードと一致します。これらの要素に対して実行されるアクションは内部的に一覧表示され、各テンプレートを適用した結果を選択的にコピーしますが、選択基準テンプレートは各属性と要素の名前になります。その結果、このテンプレートのみが存在する場合、出力処理ルールが適用された元の入力文書のコピーになります。

2番目のテンプレートは拒否されます。

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

ここでは、特にvalue<div>という属性を持つ要素と一致します。したがって、一致するブロックはこのテンプレートで生成された出力に置き換えられます。このブロックは空であるため(終了者がいるため)、出力は生成されません。class'block highlight'<div>...</div>/

一方、

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

抑制されたdivブロックの代わりにいくつかのテキストが出力されます。

修正された質問に基づく他の抑制テンプレートは次のとおりです。

<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>

このテンプレートはすべてのdiv要素に適用され、class属性値も含むサブ範囲要素のテキストコンテンツにline「GET / thestring」文字列が含まれていないかどうかをテストします。

文字列が含まれていない場合は、最初のテンプレートと同じコピーを実行します。それ以外の場合は、対応するdivブロックの出力を抑制するために何もしません。

ドキュメントの要素と属性の処理方法を定義するXPathと、処理テンプレートを作成するXSLTについて詳しく読んでみると、これらの例は初心者がより明確に理解するのに役立ちます。

おすすめ記事