在 bash 中操作 html 字符串

在 bash 中操作 html 字符串

所以我从 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

答案取决于您的输入有多灵活。

如果我们假设

  1. 数字总是在第三行,
  2. 数字始终是整数,
  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

然而这种做法是非常脆弱的。例如,它会失败 on <tr><td>apple</td><td>400</td><td style="color: #010203">432</td><td>730</td></tr>(因为010203instyle="color: #010203"也会被识别为数字),甚至 on <tr><td>mars1</td><td>400</td><td>432</td><td>730</td></tr>(因为1inmars1也会被识别为数字)。

当然,你还可以进一步精确限制,例如

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 方法只能用于临时的快速而肮脏的单行代码。

相关内容