2012-02-07 39 views
2

我将如何删除锚标记,但将锚文本保留在Bash中?所以我想删除除了文字示例以外的所有内容。删除锚标记,但保持锚文本

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

所以,如果我做的:

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

,去除所有的HTML。我正在寻找删除只是锚标记,但也保留锚文本...在这种情况下的示例文本。

回答

5

你可以使用下面的命令:

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

,或者,你也可以因为non greedy则表达式中使用perl代替sed将是有益的位置:

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

注意:使用解析HTML的正则表达式是discouraged,但对于这个小任务,我认为可以坚持使用命令行中提供的工具。

编辑:只删除锚点标记,你可以使用正则表达式可以更新如下:

sed -e 's/<\/\?a\s*[^>]*>//g' 
+0

我期待用sed只删除锚点标记并不是所有的标签。那可能吗? – user983223 2012-02-07 20:52:14

+0

@ user983223是的,我已经更新了我的答案。 – jcollado 2012-02-07 20:55:24

+0

删除锚标记不起作用......它仍然显示我最初回应的所有内容。 – user983223 2012-02-07 22:37:43

0

如果你的输入结构良好,你可以从命令行使用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 match open tags except XHTML self-contained tags :-)