【问题标题】:AWK to replace HTML tag with another and keep textAWK用另一个替换HTML标签并保留文本
【发布时间】:2022-01-20 17:09:49
【问题描述】:

我正在寻找一种将 HTML 标记替换为另一个标记的方法,但保留文本。

我有一个很大的 HTML 文件,其中包含:

<span class="desc e-font-family-cond">fork</span>

我想用&lt;strong&gt;标签替换&lt;span&gt;标签:

<strong>fork</strong>

工具并不重要,但我正在寻找一种 CLI 方法。

我不是在寻找 HTML 处理器,因为输入是一个文本文件,其中包含一些 HTML 代码(不是干净/有效的 HTML),我正在手动处理输出(复制、修改、稍后在其最终版本中使用)地方)。我只是想通过替换节省一些时间。

【问题讨论】:

  • “用标签替换标签”是什么意思?
  • @JNevill,我忘了添加示例,我更新了问题。
  • 知道了。谢谢。
  • Don't Parse XML/HTML With Regex.。我建议使用 XML/HTML 解析器(xmlstarlet、xmllint ...)。
  • @Cyrus 有时我认为这是允许的,请参阅扩展问题。

标签: linux awk command-line


【解决方案1】:

我会使用 GNU sed 来完成这个任务,让 file.txt 内容成为

<span class="desc e-font-family-cond">fork</span>

然后

sed -e 's/<span[^>]*>/<strong>/g' -e 's/<\/span>/<\/strong>/g' file.txt

输出

<strong>fork</strong>

说明:首先替换span开始使用&lt;strong&gt;,其次替换span关闭使用&lt;/strong&gt;

【讨论】:

    【解决方案2】:

    考虑使用 Python 和 BeautifulSoup 之类的工具来处理 HTML。尝试使用 sedawk 等其他工具解析 HTML 可能会导致 terrible places

    举个例子:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('<li><span class="desc e-font-family-cond">fork</span>')
    for spanele in soup.findAll('span'):
        spanele.name = 'p'
    html_string = str(soup)
    print(html_string);
    

    这是轻量级且非常简单的,并且使用专门为解析它而构建的库可以正确处理 html。

    【讨论】:

      【解决方案3】:

      不要使用 AWK 处理 HTML 文件。如果可以将 HTML 文件转换为 XHTML 文件,则可以使用 xsltproc 进行 XML 转换,如下所示:

      trans.xsl 文件:

      <?xml version="1.0" encoding="utf-8"?>
      <xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
        <xsl:output method="xml" indent="yes" encoding="utf-8"/>
      
        <xsl:template match="@*|node()">
          <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
          </xsl:copy>
        </xsl:template>
      
        <xsl:template match="span[@class='desc e-font-family-cond']">
          <strong><xsl:apply-templates/></strong>
        </xsl:template>
      
      </xsl:stylesheet>
      

      用于调用 xsltproc 的 CLI 命令,显然必须安装:

      xsltproc trans.xsl file.html
      

      此命令的标准输出是您想要的更正后的 HTML 文件。

      【讨论】:

        【解决方案4】:

        使用 sed:

        sed 's,&lt;\(\/\)\?span\(\s\)\?,&lt;\1strong\2,g'

        $ echo '<span class="desc e-font-family-cond">fork</span>' | sed 's,<\(\/\)\?span\(\s\)\?,<\1strong\2,g'
        <strong class="desc e-font-family-cond">fork</strong>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-19
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 2013-04-23
          • 2019-08-27
          相关资源
          最近更新 更多