包含新线时,正则表达式不会产生匹配

问题描述 投票:0回答:1

我试图解析的版本号和使用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?感谢您的任何提示。

regex sed grep
1个回答
2
投票

没有为GNU的grep,使得-z匹配换行符的输入,例如\s选项:

cat tt_news_history | grep -z '<tr>\s*<td'

从信息文件的有关片段:

“-z”“--null数据”治疗输入和输出数据为线条的序列,每个由一个零字节(ASCII NUL字符),而不是一个新行终止。喜欢“-Z”或“--null”选项,这个选项可以用诸如“排序-z”命令可以用来处理任意文件名。

(...)

  1. 我怎样才能跨行匹配吗?

标准的grep不能做到这一点,因为它是从根本上线为主。因此,仅仅使用“[:空间:]”字符类不匹配你所期望的方式换行。

与GNU“grep的”选项“-z”(“--null数据”),每个输入“线”是由一个空字节终止; *注意:其他选项::。因此,你可以在输入匹配换行符,但通常如果有匹配整个输入输出,所以这种用法通常与像“-q”,e.g输出抑制选项组合:

printf的 '富\ NBAR \ N' | grep的-z -q '富[[:空间:]] + bar' 的

如果这些还不够,你可以给它“grep的”前转换输入,或转向“的awk”,“sed的”,“perl的”,或者被设计跨线运行许多其他工具。

© www.soinside.com 2019 - 2024. All rights reserved.