![在 bash 中操作 html 字符串](https://linux22.com/image/190342/%E5%9C%A8%20bash%20%E4%B8%AD%E6%93%8D%E4%BD%9C%20html%20%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
所以我从 html 文件中得到了三行:
/html>
<table style="width:500px;text-align:left;">
<tr><td>apple</td><td>400</td><td>432</td><td>730</td></tr>
我需要以某种方式获得第三行中可见的三位数字(400、432、730)并将总和(1562)分配给它自己的名为 apple_num 的变量。任何帮助将不胜感激!
答案1
您可以使用它xmlstarlet
来解析 XML 并挑选出第二个、第三个和第四个<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。第二次调用解析该 XML 并提取所需的<td/>
元素值以及+
它们之间的符号。管道的最后部分执行数学运算,给出您想要的结果值。这是apple_var
根据需要分配的。
答案2
答案取决于您的输入有多灵活。
如果我们假设
- 数字总是在第三行,
- 数字始终是整数,
- 第三行不包含我们需要的数字,
那么就可以很简单
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
然而这种做法是非常脆弱的。例如,它会失败 on <tr><td>apple</td><td>400</td><td style="color: #010203">432</td><td>730</td></tr>
(因为010203
instyle="color: #010203"
也会被识别为数字),甚至 on <tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>
(因为1
inmars1
也会被识别为数字)。
当然,你还可以进一步精确限制,例如
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
但你越精确,它的可读性就越差。因此,通常您应该更喜欢更通用的方法,例如罗艾玛提出的一项,而 grep/sed/awk 方法只能用于临时的快速而肮脏的单行代码。