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。尝试使用 sed
或 awk
等其他工具解析 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
关闭。
我正在寻找一种方法将 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。尝试使用 sed
或 awk
等其他工具解析 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
关闭。