我试图解析的版本号和使用sed或者grep的相应日期的页面https://extensions.typo3.org/extension/tt_news/。更具体地讲,我很喜欢下面的HTML部分:
<tr>
<td class="align-middle">
<strong>3.6.0</strong> /
<span class="ter-ext-state-beta">beta</span>
<br />
<small>
April 06, 2014
</small>
</td>
<td class="align-middle">
tt_news for TYPO3 4.5 - 6.2 (compatibility update)
</td>
<td class="align-middle">
<strong>4.5.0 - 6.2.99</strong>
</td>
<td class="align-middle">
<a class="btn btn-primary" title="Size: 2.58MB" href="/extension/download/tt_news/3.6.0/zip/">
<strong>
Download ZIP Archive
</strong>
</a>
</td>
</tr>
我想从这些部分的版本(strong标签之间)和日期(小标签之间)来获得。到目前为止,我所有的尝试都失败了,我可以缩小问题的东西很容易。我已经测试了以下的正则表达式只试图得到一个tr标签,然后空格和regex101.com一个td标签,并在那里,它工作完全正常:
<tr>\s*<td
它给了我5场比赛这是正确的。下面的一个也能正常工作:
<tr[^>]*>\s*<td
它产生38分的结果,因为它包括具有CSS类属性那些TR标记。然而,无论是使用grep也不与sed的我能得到这个工作。只要我包括\ S没有任何比赛了。这里是什么样子:
cat tt_news_history | grep '<tr>\s*<td'
没有命中。
cat tt_news_history | grep '<tr>'
6次命中。
cat tt_news_history | grep '<tr[^>]*>'
大量的点击率(未计)。与SED同样的事情。我究竟做错了什么?为什么我不能用一个\ s?感谢您的任何提示。
没有为GNU的grep,使得-z
匹配换行符的输入,例如\s
选项:
cat tt_news_history | grep -z '<tr>\s*<td'
从信息文件的有关片段:
“-z”“--null数据”治疗输入和输出数据为线条的序列,每个由一个零字节(ASCII NUL字符),而不是一个新行终止。喜欢“-Z”或“--null”选项,这个选项可以用诸如“排序-z”命令可以用来处理任意文件名。
(...)
- 我怎样才能跨行匹配吗?
标准的grep不能做到这一点,因为它是从根本上线为主。因此,仅仅使用“[:空间:]”字符类不匹配你所期望的方式换行。
与GNU“grep的”选项“-z”(“--null数据”),每个输入“线”是由一个空字节终止; *注意:其他选项::。因此,你可以在输入匹配换行符,但通常如果有匹配整个输入输出,所以这种用法通常与像“-q”,e.g输出抑制选项组合:
printf的 '富\ NBAR \ N' | grep的-z -q '富[[:空间:]] + bar' 的
如果这些还不够,你可以给它“grep的”前转换输入,或转向“的awk”,“sed的”,“perl的”,或者被设计跨线运行许多其他工具。