次のシナリオのシェルスクリプトコマンドの作成を案内できる人はいますか?
以下に示すように、すべてのタグが1行に含まれる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'
これは2番目を引き出すでしょう
awk -F"TESTCASE-" '{print $3}' test.html |sed -e 's/<[^>]*>/ /g'
awkで-vオプションを使用すると、bash変数を渡して必要なチャンクを抽出できます。