Bash正则表达式 - 如何从HTML文件中懒惰地解析列表

时间:2018-01-16 11:55:32

标签: regex bash

我有getFirstName()个文件,想要在bash脚本中解析它以获取最新的(最顶层的)更改列表:

String

预期产出:

changes.html

如何在bash脚本中执行此操作?

我一直在尝试使用bash regexp,但我确实做错了什么

    . . .
<h1>        Changes        </h1>
<h2>
  <a href="3/changes">#3</a>
</h2>
<ol>
  <li>Recent Text line 1</li>
  <li>Recent Text line 2</li>
</ol>
<h2>
  <a href="2/changes">#2</a>
</h2>
<ol>
  <li>Text line 1</li>
  <li>Text line 2</li>
  <li>Text line 3</li>
</ol>
<h2>
  <a href="1/changes">#1</a>
</h2>
<ol>
  <li>Text line 1</li>
  <li>Text line 2</li>
</ol>
. . .

以上脚本仅返回:

Recent Text line 1
Recent Text line 2

如果我删除regexp(changes_regex='(<ol><li>.*</li></ol>)?' changes_list=$(< ~/Documents/outfile.html) if [[ $changes_list =~ $changes_regex ]]; then echo 'match' n=${#BASH_REMATCH[*]} while [[ $i -lt $n ]]; do echo " capture[$i]: ${BASH_REMATCH[$i]}" let i++ done else echo 'no match' fi )中的括号,我会得到贪婪的匹配。

如何正确构建正则表达式以便只获取第一个列表内容?

2 个答案:

答案 0 :(得分:1)

sed -n '/<ol>/,/<\/ol>/p; /<\/ol>/q' changes.html | sed -r 's/<li>(.*)<\/li>/\1/g;s/<.*//g'

输出(第6行,第7行):

  Recent Text line 1
  Recent Text line 2

我理解你了吗?

答案 1 :(得分:1)

使用xmllint和XPath来解析html

xmllint --html --xpath '//h2[a[@href="3/changes"]]/following-sibling::ol[1]/li' first.html | sed -re 's/<li>([a-zA-Z0-9 ]+)<\/li>/\1\n/g'
Recent Text line 1
Recent Text line 2