だから私は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
最初の呼び出しはxmlstarlet
HTMLを解析し、可能であればそれをXMLに変換します。 2番目の呼び出しはXMLを解析し、必要な<td/>
要素値と+
その間のシンボルを抽出します。パイプラインの最後の部分では、目的の結果値を提供する数学演算を実行します。これはapple_var
必要に応じて割り当てられます。
答え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も数字として認識されるため失敗します。010203
style="color: #010203"
<tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>
1
mars1
もちろん、より正確に制限することもできます。たとえば、次のようになります。
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 メソッドは、一時的で高速で汚れた単一のライナーにのみ使用する必要があります。