提取两个值之间的特定单词

extract a specific word between two values

我卷曲了一个 html 页面并将输出存储到变量中,所以我尝试在两个值之间提取一个词,但我失败了。

 </tr> <tr> <td><a <a href="https://test/one/AAA">AAA</a></td>
 <td>Thu Aug 30 09:59:36 UTC 2018</td> <td align="right"> 2247366 </td>
 <td></td> </tr> <tr> <td><a
 href="https://test/one/1.1.22">1.1.22</a></td> <td>Thu Aug 30 09:59:36
 UTC 2018</td> <td align="right"> 5 </td> <td></td> </tr> </table>
 </body> </html>

 content=$(curl -s https://test/one/)
 echo $content | sed -E 's_.*one/([^"]+).*__'

我试图在 one/ 之后和之前捕获值,所以我想提取 AAA、1.1.22、...

$ ... | sed -E 's_.*one/([^"]+).*__'

AAA
BBB

因为你的内容中有斜杠,最好选择不同的分隔符,这里我使用了 _

更新 由于您大幅更改了输入文件格式,这里是更新后的脚本

$ echo "$contents" | sed -nE '/one/s_.*one/([^"]+).*__p'
AAA
1.1.22

不要使用正则表达式解析 XML/HTML,使用适当的 XML/HTML 解析器和强大的 查询。

理论:

According to the compiling theory, XML/HTML can't be parsed using regex based on finite state machine. Due to hierarchical construction of XML/HTML you need to use a pushdown automaton and manipulate LALR grammar using tool like YACC.

realLife©®™ 中的日常工具:

您可以使用以下之一:

xmllint often installed by default with libxml2, xpath1 (check my wrapper 以换行符分隔输出

xmlstarlet可以编辑,select,转换...默认没有安装,xpath1

xpath 通过 perl 的模块 XML::XPath、xpath1

安装

xidel xpath3

saxon-lint 我自己的项目,包装@Michael Kay 的 Saxon-HE Java 库,xpath3

或者您可以使用高级语言和适当的库,我想到了:

's lxml (from lxml import etree)

's XML::LibXML, XML::XPath, XML::Twig::XPath, HTML::TreeBuilder::XPath

, check this example

DOMXpath, check this example


检查:Using regular expressions with HTML tags


使用 的示例:

//a[contains(@href, "https://test/sites/two/one")]