使用awk或shell脚本分块文件

时间:2012-12-13 20:04:43

标签: bash shell awk

这感觉它应该是一项简单的任务,但不知何故无法将我的大脑包裹起来。我有带H1-H4标题的HTML文件。我想获得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标题之前的行上结束。

3 个答案:

答案 0 :(得分:2)

如果你没有发布预期的输出,我们只是猜测,但如果你真的想要</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。

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

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

答案 1 :(得分: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。

不幸的是,您已将其标记为 bash shell awk ,并且这些都无法真正处理HTML输入干净的方式。

答案 2 :(得分:0)

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

$ sed -e '1,/<H3/d' -e '/<H3/,$d'