BashでHTML文字列を操作する

BashでHTML文字列を操作する

だから私はhtmlファイルから3行を得ました。

/html> 
<table style="width:500px;text-align:left;">
<tr><td>apple</td><td>400</td><td>432</td><td>730</td></tr>

どういうわけか、3行目(400、432、730)に表示される3桁の数字を取得し、その合計(1562)をapple_numという独自の変数に割り当てる必要があります。どんな助けでも大変感謝します!

答え1

これを使用xmlstarletしてXMLを解析し、2番目、3番目、および4番目の要素<td/>値を選択できます。追加のテーブルとテーブル行がある場合は、より多くのHTMLコンテンツを提供する必要があります。それ以外の場合は、適切なセクションを選択する方法を直接理解する必要があります。

解析のためのコードスニペットpage.html

apple_var=$(
    xmlstarlet fo -H page.html |
    xmlstarlet sel -t -v 'concat(//td[2],"+",//td[3],"+",//td[4])' -n 2>/dev/null |
    bc
)
echo apple_var=$apple_var

出力

apple_var=1562

最初の呼び出しはxmlstarletHTMLを解析し、可能であればそれをXMLに変換します。 2番目の呼び出しはXMLを解析し、必要な<td/>要素値と+その間のシンボルを抽出します。パイプラインの最後の部分では、目的の結果値を提供する数学演算を実行します。これはapple_var必要に応じて割り当てられます。

答え2

答えは、入力がどれほど柔軟であるかによって異なります。

私たちが仮定すると

  1. 番号は常に3行目にあり、
  2. 数値は常に整数です。
  3. 3行目には必要な数字は含まれていません。

もしそうなら、とても簡単かもしれません

apple_num=$(sed -n '3p' file.html |       # output the 3rd line
            grep -Eo '[0-9]+' |           # extract all integers and output then one per line
            awk '{s+=$1} END {print s}')  # output sum of all the numbers

しかし、このアプローチは非常に壊れやすい。たとえば、inも数字として認識されるため<tr><td>apple</td><td>400</td><td style="color: #010203">432</td><td>730</td></tr>失敗し、inも数字として認識されるため失敗します。010203style="color: #010203"<tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>1mars1

もちろん、より正確に制限することもできます。たとえば、次のようになります。

apple_num=$(sed -n '3p' file.html |       # extract 3rd line
            egrep -o '>[0-9]+<' |         # extract only parts like >123< (one per line)
            egrep -o '[0-9]+' |           # extract integers (one per line)
            awk '{s+=$1} END {print s}')  # output sum of all the numbers

しかし、より正確なほど読みやすくなります。したがって、通常、次のようなより一般的なアプローチを好む必要があります。Emma Luoが提案したアイテム、 grep/sed/awk メソッドは、一時的で高速で汚れた単一のライナーにのみ使用する必要があります。

関連情報