删除HTML锚标记,但保留bash命令行中的锚文本



如何删除锚点标记,但将锚点文本保留在Bash中?所以我想删除除了单词Exampletext之外的所有内容。

<a href="http://example.com">Example text</a>

所以如果我这样做:

echo '<a href="http://example.com">Example text</a>' | sed -e 's/<[^>]*>//g'

这将删除所有HTML。我希望只删除锚标记,但也保留锚文本,在本例中为"示例文本"。

您可以使用以下命令:

$ echo '<a href="http://example.com">Example text</a>' | sed -e 's/<[^>]*>//g'
Example text

或者,您也可以使用perl而不是sed,因为非贪婪正则表达式在这里会很有用:

$ echo '<a href="http://example.com">Example text</a>' | perl -pe 's/<.*?>//g'
Example text

注意:不鼓励使用regex解析HTML,但对于这个小任务,我认为可以坚持使用命令行中可用的工具。

编辑:要删除锚标签,可以使用正则表达式。可以更新如下:

sed -e 's/</?as*[^>]*>//g'

这里有一个有用的指南:http://www.eng.cam.ac.uk/help/tpl/unix/sed.html

如果您的输入格式正确,您可以从命令行使用XSLT。(我推荐Saxon,但Xalan可以。):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="a">
    <xsl:apply-templates/>
  </xsl:template>
</xsl:stylesheet>

另请参阅RegEx匹配除XHTML自包含标记之外的开放标记:-)

接受的答案会从HTML中删除所有标记,而不仅仅是链接。一个更好的Perl命令只删除<a>..</a>(但不删除其他标记),同时留下锚文本,它是:

perl -pe 's/<a [^>]*>(.*?)</a>/$1/gi'

在上测试

<html><A HREF="http://example.com/"><b>Anchor Text</b></A></html>

它留下了:

<html><b>Anchor Text</b></html>

要只删除包含特定URL的链接(而不删除其他链接),您可以使用:

perl -pe 's/<a [^>]*href="http://example.com[^>]+>(.*?)</a>/$1/gi'

你可以通过管道文本来使用它:

echo "<html>..." | perl -pe 's/...'

或者使用-i标志将文件修改为perl:

perl -pe 's/...' -i file.html

最新更新