【问题标题】:How to delete all HTML tags appearing in a variable in BASH?如何删除 BASH 变量中出现的所有 HTML 标签?
【发布时间】:2014-06-04 09:28:40
【问题描述】:

我有一个 BASH 变量,其中包含一些 HTML 标记,例如:

word="<b><div class="light">apple</div></b><i>This is some text.</i>"

我需要删除所有 HTML,基本上是每对 &lt;&gt; 之间的所有内容,只留下内容,例如,结果将是:

appleThis is some text.

我尝试了许多可能的解决方案:

word="$(sed 's#<.*>##g' <<< $word)"
word="$(awk '/<html>/{f=1;next} !f; /<\/html>/{f=0}' <<< $word)"

奇怪的是,这似乎删除了所有文本。

  • 注意,有时 HTML 标签可能没有结束标签,但无论是否找到一对标签,都应该删除所有标签。

如何从 BASH 变量中删除所有 HTML 标记?

【问题讨论】:

  • 使用 XML 解析器。 xmlstarlet,也许吧?

标签: html bash variables awk sed


【解决方案1】:

正如大家所说,不要使用正则表达式。它迟早会破裂。使用在剥离 HTML 方面提供一些帮助的语言。例如,Perl 有一个名为 HTML::Strip 的 CPAN 模块。使用它,你可以这样做:

$ word="<b><div class="light">apple</div></b><i>This is some text.</i>"
$ perl -MHTML::Strip -lpe '{$hs = HTML::Strip->new(); $_ = $hs->parse($_)}' <<< "$word"
apple This is some text.

【讨论】:

    【解决方案2】:

    正如评论中提到的,最好使用 XML 解析器。

    如果您坚持使用正则表达式,您可以在sed 中使用否定字符类:

    sed 's/<[^>]*>//g' <<< "$word"
    

    【讨论】:

      【解决方案3】:

      USEFUL ONE-LINE SCRIPTS FOR SED,有您要求的样本。

      sed -e :a -e 's/<[^>]*>//g;/</N;//ba' <<< $word
      

      【讨论】:

        【解决方案4】:

        重复(如*)在正则表达式中默认是贪婪的。因此&lt;.*&gt; 将匹配从第一个&lt; 到最后一个&gt; 的所有内容。在您的情况下,它只会匹配整个字符串,因此会删除所有内容。

        您需要使用&lt;[^&gt;]*&gt; 明确不匹配&lt; 或使用&lt;.*?&gt; 启用重复的非贪婪版本。

        顺便说一句:在 bash 变量中包含 HTML 听起来很奇怪。也许有一种更简单的方法来完成您想做的任何事情,而无需中间的 bash 变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-31
          • 2015-12-13
          • 2012-09-25
          • 2013-04-28
          • 2012-10-11
          • 1970-01-01
          • 2011-03-02
          相关资源
          最近更新 更多