
sedを使用してhtmlタグから値を抽出したいと思います。
文書:
<td class=xl7128074></td>
<td class=xl7128074></td>
<td class=xl7128074></td>
</tr>
<tr height=21 style='height:15.75pt'>
<td height=21 class=xl8428074 style='height:15.75pt;border-top:none'>ANT</td>
<td class=xl10028074 style='border-top:none;border-left:none'>$interoprfbcheck_prodconnectorstatus_ANT</td>
<td class=xl8228074>ANT</td>
<!-- This is set by Python -->
<td class=xl155577 style='border-left:none;font-size:11.0pt;color:#006100;
font-weight:400;text-decoration:none;text-underline-style:none;text-line-through:
none;font-family:Arial;border-top:none;border-right:1.0pt solid windowtext;
border-bottom:1.0pt solid windowtext;border-left:1.0pt solid windowtext;
background:#E6EFCE;mso-pattern:black none'>
GREEN</td>
<td class=xl7128074></td>
<td class=xl7128074></td>
<td class=xl7128074></td>
期待される結果が欲しい
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GREEN
私はsed -n 's/<td.*>\(.*\)<\/td>/\1/p' filename.html
次のような結果を使用して取得しています:
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GEEENは来ません。同じ行にないので、次の行の結果を得るために追加できるものはありますか?
答え1
html2
これをsedの「プリプロセッサ」として使用できます。
$ html2 <file 2>/dev/null | sed '/td=/!d;s/^.*td=//'
ANT
$interoprfbcheck_prodconnectorstatus_ANT
ANT
GREEN
答え2
GREEN
sed
ジェネレータが別の行に配置されているため、スクリプトが一致するものが見つからないため表示されません。着信ストリームは、特別な準備なしにsed
1行ずつ一致するスペースに引き込まれます。
N
したがって、コマンドを使用して一致スペースが閉じられるまで、新しい行を一致スペースにドラッグし、予約済みスペースにパターンスペースのコピーを保存し、先行</tr>
タグ<tr ...>
を削除し、</tr>
一致スペースの先頭から最後まですべてを削除する必要があります。印刷してください。
その後、一致するスペースをスペースを保存することに置き換えて、印刷された部分を削除してから先行<tr ...>
タグを再検索する必要があります。
info sed
詳細については、次を参照してください。
答え3
公開したHTMLの例は、さまざまな理由で有効なXMLではありません。ただし、問題が解決したら、次のコマンドを使用できます。
xmlstarlet sel -t -v '//td[text()]' input.html
空でない最後のテキストが代わりにtd
あるため、結果は正確に予想されたものとは異なります。GREEN
\nGREEN