代码之家  ›  专栏  ›  技术社区  ›  kaidentity

当包含新行时,regex不生成匹配项

  •  0
  • kaidentity  · 技术社区  · 6 年前

    我正在分析页面 https://extensions.typo3.org/extension/tt_news/ 对于版本号和对应的日期,使用SED或GREP。 更具体地说,我对以下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>
    

    我想从这些部分中的每一个获得版本(在 坚强的 标签)和日期(在 小的 标签)。 到目前为止,我所有的尝试都失败了,我可以把问题缩小到非常容易的地方。 我测试了下面的regex,它只尝试 TR 标记后接空格和 TD 在regex101.com上加上标签,效果非常好:

    <tr>\s*<td
    

    它给我5根火柴,这是正确的。下面的一个也很好用:

     <tr[^>]*>\s*<td
    

    它产生38个结果,因为它包含了那些带有css class属性的tr标记。 然而,无论是grep还是sed,我都不能让它发挥作用。一旦我包括了,就没有任何匹配了。这是它的样子:

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

    没有点击。

    cat tt_news_history | grep '<tr>'
    

    6打。

    cat tt_news_history | grep '<tr[^>]*>'
    

    很多点击率(不算在内)。和塞德一样。 我做错什么了?为什么我不能用A? 谢谢你的提示。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dzienny    6 年前

    有一个 -z GNU GREP的选项 \s 匹配输入中的换行符,例如:

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

    信息文档中的相关片段:

    __-Z___--空数据_ 将输入和输出数据视为行序列,每个行都终止 以零字节(ASCII NUL字符)代替换行符。 与__-Z_或__--null_选项类似,此选项可用于 __sort-z_秷等命令处理任意文件名。

    (…)

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

    标准grep不能这样做,因为它基本上是基于行的。 因此,仅使用_[:space:]__秷字符类不匹配 以您可能期望的方式换行。

    使用GNU__grep_____-Z__-空数据__,每个输入__line__为 以空字节结尾;*注意其他选项::。因此,您可以匹配 输入中的换行符,但通常如果有匹配项, 输入是输出,因此这种用法通常与 输出抑制选项,例如:

    printf'foo\n bar\n'grep-z-q'foo[:space:]]+bar'

    如果这还不够,可以在给出输入之前对其进行转换。 到__grep_,或转到__awk_、__sed_、__perl_,或许多其他实用程序 设计用于跨线路运行的。