【问题标题】:How to match and replace multiline html file with sed如何用sed匹配和替换多行html文件
【发布时间】:2017-05-01 20:53:29
【问题描述】:

我有一个类似这样的文本文件。

<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|
}'

我想删除所有&lt;td&gt;&lt;/td&gt; 标记并获取由某个字符串分隔的所有字符串(我可以稍后使用它作为分隔符来过滤这些字符串)。我使用了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>

【问题讨论】:

  • 我建议使用 XML/HTML 解析器 (xmllint, xmlstarlet ...)。
  • 为最终的 HTML 提供您预期的输出,您可以使用xmlstarlet 吗?我可以提供一个。

标签: html shell sed


【解决方案1】:

输出没有像我预期的那样。

您的sed 代码不起作用,因为&lt;td.*&gt;\(.*\)&lt;/td&gt; 匹配从第一个&lt;td 到最后一个&lt;/td&gt; 的模式空间部分,这是由于* 量词的greediness。不幸的是,sed 不支持带有不贪婪量词的更现代的正则表达式风格;因此,其他一些工具会更合适。

我想删除所有&lt;td&gt;&lt;/td&gt; 标记并获取所有由某个字符串分隔的字符串...

如果这些标签总是(如您的示例)在单独的行上,我们可以使用简单的sed 命令:

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

所有字符串此后都由一些字符串分隔,即\n后跟空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2012-06-09
    • 1970-01-01
    • 2016-10-08
    • 2015-11-16
    • 2013-11-14
    • 2020-04-28
    相关资源
    最近更新 更多