如何使用sed匹配和替换多行html文件

时间:2016-12-16 05:44:48

标签: html shell sed

我有一个像这样的文本文件。

<tbody>
            <tr>
                <td>
                    String1
                </td>
                <td>
                    String2
                </td>
                <td>
                    String3
                </td>
                    ...
                    ...
                <td>
                    StringN
                </td>
            </tr>
</tbody>

这是我想要的输出。

<tbody>
            <tr>
                    String1;String2;String3;... ...;StringN
            </tr>
</tbody>

这是我的BUGGY代码。

sed '{
:a
N
$!ba
s|<td.*>\(.*\)</td>|\1|
}'

我想删除所有<td></td>标记,并通过某些字符串获取所有字符串(我可以稍后使用该字符串过滤这些字符串作为分隔符字符)。我使用了这个URL中给出的解决方案。输出并不像我预期的那样。

这是实际的代码

<tbody>
            <tr>
                <td>
                    <a href="/120.52.72.58/80">120.52.72.58:80</a>
                </td>
                <td>
                    HTTP
                </td>
                <td>
                    <span class="text-danger">Transparent</span>
                </td>
                <td>
                    <abbr title="2016-12-15 00:07:46">12h ago</abbr>
                </td>
                <td class="small">
                    <span class="text-muted">&mdash;</span>
                </td>
                <td>
                    <img src="/flags/png/cn.png" alt="China (CN)" title="China (CN)" onerror="this.style.display='none'"> <abbr title="China">CN</abbr>
                </td>
                    <td class="small">
                            Beijing
                    </td>
                    <td class="small">
                            Beijing
                    </td>
                    <td class="small">
                            China Unicom IP network
                    </td>
                <td class="small">
                        <span class="text-muted">&mdash;</span>
                </td>
            </tr>
</tbody>

1 个答案:

答案 0 :(得分:0)

  

输出不符合我的预期。

您的sed代码不起作用,因为由于{{3},<td.*>\(.*\)</td>匹配了从前一个<td到最后一个</td>的部分模式空间。 *量词的}}。不幸的是,sed不支持带有不合要求的量词的更现代的正则表达式。因此,其他一些工具会更合适。

  

我想删除所有<td></td>标签,并获取所有由某个字符串定界的字符串…

如果这些标记始终(如您的示例中)始终位于单独的行中,则可以使用简单的sed命令:

sed '/<\/*td.*>/d'

所有字符串之后都用某个字符串分隔,该字符串是\n,后跟空格。