AWK 将 HTML 标记替换为另一个标记并保留文本

AWK to replace HTML tag with another and keep text

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

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

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

我想用 <strong> 标签替换 <span> 标签:

<strong>fork</strong>

工具并不重要,但我正在寻找一种 CLI 方式来完成它。

我不是在寻找 HTML 处理器,因为输入是一个文本文件,其中包含一些 HTML 代码(不是 clean/valid HTML)并且我我手动处理输出(复制、修改、稍后在最终位置使用)。我只是想通过替换节省一些时间。

考虑使用 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 使用专门为解析它而构建的库进行了正确处理。

不要使用 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 文件,如您所愿。

使用 sed:

sed 's,<\(\/\)\?span\(\s\)\?,<strong,g'

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

我会按照以下方式使用 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>

说明:先用<strong>替换span开始,再用</strong>替换span关闭。