sed(正则表达式)无法正常工作

时间:2015-06-18 09:30:26

标签: regex sed

我必须从下面的HTML代码中分离出一个表达式:

<div class="summary">
                <h3><a href="/questions/30727515/why-is-executing-java-code-in-comments-allowed" class="question-hyperlink" title="The following code produces the output &quot;Hello World!&quot;. (No really, try it) public static void main(String... args) { // The comment below is no typo. // \u000d System.out.println(&quot;Hello ...">Why is executing Java code in comments allowed?</a></h3>
    <div class="tags t-java t-unicode">
        <a href="/questions/tagged/java" class="post-tag" title="show questions tagged &#39;java&#39;" rel="tag">java</a> <a href="/questions/tagged/unicode" class="post-tag" title="show questions tagged &#39;unicode&#39;" rel="tag">unicode</a> 
    </div>
    <div class="started">
        <a href="/questions/30727515/why-is-executing-java-code-in-comments-allowed/?lastactivity" class="started-link">modified <span title="2015-06-15 17:43:58Z" class="relativetime">yesterday</span></a>
        <a href="/users/388520/zwol">zwol</a> <span class="reputation-score" title="reputation score 52560" dir="ltr">52.6k</span>
    </div>
</div>

我想要的部分从....开始....'title =“以下代码生成outp ..........在允许的评论中执行Java代码?'一直到'a'和'h3'标签结束。

由于种种原因,我只能使用sed或awk。

我尝试了各种正则表达式。由于必需部分有时甚至可以跨越多行,我使用了以下sed命令:(因为。*仅匹配换行符)

    sed -n '1h;1!H;${;g;s/.*<h3><a href="\/questions\/.*link" title="\(.*\)<\/a><\/h3>.*/\1/p;}' Trial.html        

我对此没有任何结果。但是,如果我删除了结尾部分:

    sed -n '1h;1!H;${;g;s/.*<h3><a href="\/questions\/.*link" title="\(.*\)/\1/p;}' Trial.html

我能够捕获所需字符串的开头,并打印到最后。

我也提到过这个serverfault.com问题,求助: https://serverfault.com/questions/315145/regex-for-sed-to-grab-multiple-lines-or-a-better-way

修改

也可能有其他类似的块。我没有必要停在第一个结果。我从这个页面中获取了html: https://stackoverflow.com/?tab=month

这是另一个与我非常相似的问题! https://unix.stackexchange.com/questions/64645/text-between-two-tags

1 个答案:

答案 0 :(得分:0)

你的行

sed -n '1h;1!H;${;g;s/.*<h3><a href="\/questions\/.*link" title="\(\.*\)<\/a><\/h3>.*/\1/p;}' Trial.html  

该行将所有内容放入保留空间,而不是在读取文件之后,将其交换到模式空间以用于多行解析。

修改的想法,而不是分组\(\。* \),顺便说一句,因为你已经逃过了这里,所以&#39;。&#39;所以它不是任何字符,而是文字的。&#39;
你可以使用title =&#34; \([^&lt;] * \),它将捕获所有字符,直到第一个&#39;&lt;&#39;。

如果title =&#34;文件的第一部分只有一次存在,而不需要很多字母,只有^。* title =&#34;就够了。