【问题标题】:extract a specific word between two values提取两个值之间的特定单词
【发布时间】:2018-08-30 14:02:22
【问题描述】:

我将一个 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/([^"]+).*_\1_'

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

【问题讨论】:

  • 使用 xpath 这样做
  • 向我们展示您的尝试和失败。
  • 回声 $content | sed 's/.*one/=(.*)".*/\1/'

标签: string bash split extract cut


【解决方案1】:
$ ... | sed -E 's_.*one/([^"]+).*_\1_'

AAA
BBB

由于你的内容中有斜线,最好选择不同的分隔符,这里我使用_

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

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

【讨论】:

  • 永远不要用正则表达式解析 HTML
  • 那是相当教条的。 HTML 是文本,如果您不需要这种情况下的树结构,那么使用文本工具没有任何问题。
  • 谢谢我的朋友们!!但它给我的只是AAA,因为AAA,BBB,这只是一个例子,更精确,AAA,可以是0.01、0.2.1、3.33.1...
  • 不管内容是什么,只要不包含sed分隔符和引号即可。
  • 那么我怎么才能拥有剩下的呢?我只有第一个 plz
【解决方案2】:

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

理论:

根据编译理论,XML/HTML 不能使用基于finite state machine 的正则表达式进行解析。由于 XML/HTML 的分层结构,您需要使用 pushdown automaton 并使用 YACC 之类的工具操作 LALR 语法。

中的 realLife©®™ 日常工具:

您可以使用以下方法之一:

xmllint 通常默认与libxml2、xpath1 一起安装(检查my wrapper 以获得换行符分隔输出

xmlstarlet可以编辑、选择、变换... 默认不安装,xpath1

xpath 通过 perl 的模块 XML::XPath, xpath1 安装

xidelxpath3

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

或者你可以使用高级语言和适当的库,我认为:

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")]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多