다음 시나리오에 대한 쉘 스크립트 명령 작성을 안내해 줄 수 있는 사람이 있습니까?
아래와 같이 모든 태그가 한 줄에 포함된 html 파일이 있습니다.
<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>
브라우저에서 파일을 볼 때 테스트 사례 ID, 해당 심각도, 결과 및 설명에 대한 항목이 포함된 테이블이 표시됩니다. 이 HTML 파일에는 총 210개의 TestcaseID가 있습니다. 이제 TestcaseID를 언급하여 테이블의 특정 행을 삭제해야 합니다. (예를 들어, TESTCASE-002가 있는 행을 삭제해야 합니다)
답변1
sed/grep과 같은 텍스트 처리 도구를 사용하는 대신 HTML을 이해하는 도구를 사용하십시오.
예를 들어,xsh, 당신은 할 수 있습니다
open :F html file.html ;
delete //tr[td='TESTCASE-002'] ;
save :b ;
그러나 먼저 파일을 복구해야 합니다. 위치가 잘못된 태그 </body>
와 </head>
닫는 태그를 제거하세요.
답변2
다음 명령을 사용하여 태그를 제거할 수 있습니다.XSL 변환(XSLT).
xsltproc
대부분의 배포판은 명령(패키지의 일부 ) 과 함께 제공되어야 합니다 libxslt
.
다음은 쉘 스크립트에서 사용할 수 있는 변환을 수행하는 명령입니다.
xsltproc --html main.xslt index.html
제거될 XSLT입니다.테스트케이스-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>
이 접근 방식의 장점은 선언적이고 재사용이 가능하며 XML/HTML을 처리하는 코드를 쉘 스크립트의 나머지 부분과 분리한다는 것입니다. 또한 유연하고 강력합니다. 단점은 내용이 좀 길고 번거롭다는 점입니다.
이 방법은 잘못된 HTML도 처리할 수 있습니다.
답변3
이 문자열은 html 블록의 첫 번째 항목을 가져옵니다.
awk -F"TESTCASE-" '{print $2}' test.html |sed -e 's/<[^>]*>/ /g'
이것은 두 번째를 끌어낼 것입니다
awk -F"TESTCASE-" '{print $3}' test.html |sed -e 's/<[^>]*>/ /g'
awk와 함께 -v 옵션을 사용하면 bash 변수를 전달하고 필요한 청크를 추출할 수 있습니다.