【问题标题】:How to match content between HTML specific tags with attribute using grep?如何使用 grep 将 HTML 特定标签之间的内容与属性匹配?
【发布时间】:2012-11-14 00:45:35
【问题描述】:

如果我想匹配 HTML 文件中标签 <div class="Message"> 及其结束标签 </div> 中包含的文本,我应该在命令 grep 中使用哪个正则表达式?

【问题讨论】:

    标签: regex grep html-parsing


    【解决方案1】:

    您可以通过指定正则表达式来做到这一点:

    grep -E "^<div class=\"Message\">.*</div>$" input_files
    

    并不是说这只会打印在同一行找到的附件。如果您的标签跨越多行,您可以尝试:

    tr '\n' ' ' < input_file | grep -E "^<div class=\"Message\">.*</div>$"
    

    【讨论】:

    • 感谢您的回答。我的标签跨越多行,当我运行您的命令时,我收到此错误:tr: extra operand test.txt' Try tr --help' 了解更多信息。
    • @Albz:试试看,tr '\n' ' ' &lt; test.txt
    【解决方案2】:

    这是使用GNU grep的一种方式:

    grep -oP '(?<=<div class="Message"> ).*?(?= </div>)' file
    

    如果您的标签跨越多行,请尝试:

    < file tr -d '\n' | grep -oP '(?<=<div class="Message"> ).*?(?= </div>)'
    

    【讨论】:

    【解决方案3】:

    你不能只用 grep 可靠地做到这一点。您需要使用 HTML 解析器来解析 HTML。

    如果 HTML 代码有类似的内容怎么办:

    <!--
    <div class="Message">blah blah</div>
    -->
    

    你会在那个被注释掉的代码上得到一个错误的命中。这里有一些other examples,其中一个纯正则表达式选项会让你失败。

    考虑使用 XML::Grep Perl 模块中的 xmlgrep,如下所述:Extract Title of a html file using grep

    【讨论】:

    • +1 这是个好主意。我没有考虑注释代码,但我不相信 OP 也有。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签