0

感觉这应该是一项简单的任务,但不知何故无法将我的大脑包裹起来。我有带有 H1-H4 标题的 HTML 文件。我想获取 H3 标签之间的内容。不是两个 H3 之间的文本<H3></H3>而是两个 H3 之间的文本。

<H3>some text</H3>
<p> more text that I would like to grab</p>
<H3> some other text </H3>
<p> some more text that I'd like to get </p>

... 先感谢您

我被要求描述一个示例输出,我认为我在下面的评论中做了。我将重申相同的内容,如果有不清楚的地方,请告诉我。

输入:具有许多 H3 标题的长文件

输出:许多小文件,每个包含一个片段,该片段从包含 H3 标题的行开始,到下一个 H3 标题之前的行结束。

4

3 回答 3

2

如果没有您发布您的预期输出,我们只是在猜测,但如果您真的想要 and 之间的文本</H3><H3>这是使用 GNU awk 的一种方法:

$ cat file
<H3>some text</H3>
<p> more text that I would like to grab</p>
<H3> some other text </H3>
<p> some more text that I'd like to get </p>
$ gawk -F'</H3>' -v RS="<H3>" -v ORS= 'NR>1{print $NF}' file

<p> more text that I would like to grab</p>

<p> some more text that I'd like to get </p>
$

$ cat file
<H3>some text</H3><p>more text that I would like to grab</p><H3>some other text</H3><p> some more text that I'd like to get </p>
$ gawk -F'</H3>' -v RS="<H3>" -v ORS= 'NR>1{print $NF}' file
<p>more text that I would like to grab</p><p> some more text that I'd like to get </p>

$ gawk -F'</H3>' -v RS="<H3>" 'NR>1{print $NF}' file
<p>more text that I would like to grab</p>
<p> some more text that I'd like to get </p>

为此,您需要 GNU awk,以便您可以拥有多字符 RS。

请注意,当块之间的文本中包含换行符时,这些换行符会像任何其他字符一样在输出中重现。

如果以上不是您想要的,请再次告诉我们更多......

于 2012-12-14T03:14:18.013 回答
1

问题是 HTML 语法非常灵活。例如:

<H3>some text</H3>
<p> more text that I would like to grab</p>
<H3> some other text </H3>
<p> some more text that I'd like to get </p>

<H3>
    some text
</H3>
<p> 
    more
    text
    that
    I
    would
    like
    to
    grab</p>
<H3> 
  some other text
        </H3>
<p>some        more     text that I'd        like to get
</p>

将产生相同的输出。多余的空白被去除,标签可以四处散布。你不能简单地寻找一个特定的标签来知道你在追求什么。

唯一真正做到这一点的方法是使用完整的脚本语言,例如 Perl 或 Python,它具有可以为您解析和组织 HTML 格式文件的模块。您无法使用 Unix 的正则表达式解析 HTML 或 XML。

不幸的是,您已将其标记为bashshellawk,而这些都不能真正以干净的方式处理 HTML 输入。

于 2012-12-13T21:59:36.177 回答
0

首先,这个 shell 行将提取第一个 H3 到 H3 部分......

$ sed -e '1,/<H3/d' -e '/<H3/,$d'
于 2012-12-13T20:14:54.087 回答