如何删除锚点标记,但将锚点文本保留在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