<div>
저는 Mac을 사용하고 있으며 특정 문자열과 일치하는 html 파일에서 여러 블록을 제거하고 싶습니다 . 다음과 같이 sed를 사용해 보았지만 실패했습니다.
STRING
먼저, 특별한 정규식 의미를 갖고 생성된 모든 기호를 이스케이프 처리했습니다.ESCAPEDSTRING
하지만 지금은 여러 줄에서 작업하고 정규식을 사용하여 해당 줄을 삭제할 수 있는 도구를 찾는 데 어려움을 겪고 있습니다. 내 생각엔
sed
안 될 것 같아
아래 예에서는 <div>
문자열을 포함하는 모든 블록을 제거하고 GET /thestring//index.php
다른 모든 것(즉, 포함된 마지막 블록에서 두 번째 블록 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&session_id=1523141136.42&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&session_id=1523141136.42&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&session_id=3214235353.32&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&session_id=3214235353.32&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&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&session_id=1523141718.15&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&session_id=1523141718.15&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&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&session_id=1523142027.44&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&session_id=1523142027.44&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&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&session_id=1523142327.08&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
xsltproc
OSX에서 프로그램을 사용하여,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&session_id=1523141136.42&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&session_id=1523141136.42&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&session_id=3214235353.32&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&session_id=1523141136.42&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()"
문서의 모든 속성이나 노드와 일치합니다. 이러한 요소에 수행되는 작업은 내부적으로 나열되며 각 템플릿을 적용한 결과를 선택적으로 복사하지만 선택 기준 템플릿은 각 속성 및 요소의 이름이 됩니다. 결과적으로 이 템플릿만 존재하는 경우 출력 처리 규칙이 적용된 원본 입력 문서의 복사본이 됩니다.
두 번째 템플릿은 거부됩니다.
<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에 대해 자세히 읽어보면 이러한 예제는 초보자가 더 명확하게 이해하는 데 도움이 될 것입니다.