sed替换中多次出现

时间:2014-05-27 18:50:12

标签: bash sed

我正在尝试检索html文件中特定div标签内的一些数据。

我当前的html代码采用以下格式。

<div class = "class0">
    <div class = "class1">
         <div class = "class2">
             some text some text
         </div>
         Some more text
    </div>
    Too much text
</div>

当我尝试使用bash代码

在class2中的div中提取标签时
sed -e ':a;N;$!ba
        s/[[:space:]]\+/ /g
        s/.*<div class\="class2">\(.*\).*/\1/g' test.html > out.html

我得到输出html文件,代码为

some text some text </div> Some more text </div> Too much text

我希望删除第一个</div>之后的所有数据,而是替换最后一个数据。 有人可以详细说明我的错误。

2 个答案:

答案 0 :(得分:1)

你可以在awk中执行此操作:

awk '/class2/,/<\/div>/ {a[++i]=$0}END{for (j=2;j<i;++j) print a[j]}' file

在匹配/class2//<\/div>/的行之间,将内容写入数组。在文件循环结束时,跳过第一行和最后一行。

您可以使用正则表达式检查第一行和最后一行,而不是制作数组:

awk '/class2/,/<\/div>/ {if (!/class2|<\/div>/) print}' file

答案 1 :(得分:0)

这适用于检索div class =&#34; class2&#34;中的文本。标签

#!/bin/bash

htmlcode='
<div class = "class0">
    <div class = "class1">
        <div class = "class2">
            some text some text
        </div>
        Some more text
    </div>
   Too much text
</div>
'

echo $htmlcode |
sed -e's,<,\
<,g' |
grep 'div class = "class2"' |
sed -e's,>,>\
,g'|
grep -v 'div class = "class2"'