提取两个值之间的特定单词
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 解析器和强大的 xpath 查询。
理论:
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©®™ shell 中的日常工具:
您可以使用以下之一:
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
或者您可以使用高级语言和适当的库,我想到了:
python's lxml
(from lxml import etree
)
perl's XML::LibXML
, XML::XPath
, XML::Twig::XPath
, HTML::TreeBuilder::XPath
ruby nokogiri, check this example
php DOMXpath
, check this example
检查:Using regular expressions with HTML tags
使用 xpath 的示例:
//a[contains(@href, "https://test/sites/two/one")]
我卷曲了一个 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 解析器和强大的 xpath 查询。
理论:
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©®™ shell 中的日常工具:
您可以使用以下之一:
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
或者您可以使用高级语言和适当的库,我想到了:
python's lxml
(from lxml import etree
)
perl's XML::LibXML
, XML::XPath
, XML::Twig::XPath
, HTML::TreeBuilder::XPath
ruby nokogiri, check this example
php DOMXpath
, check this example
检查:Using regular expressions with HTML tags
使用 xpath 的示例:
//a[contains(@href, "https://test/sites/two/one")]