如何解决这个sed语法问题

时间:2016-04-11 21:08:02

标签: regex linux bash sed

我编写了一个正则表达式代码,用于从html文件中提取锚标记并获得此输出。

mdlinks.txt
    <a href='/aspnet/aspnet_refhtmlcontrols.asp'>ASP.NET Reference</a>
    <a href='/aspnet/webpages_ref_classes.asp'>Razor Reference</a>
    <a href='/html/html_examples.asp'>HTML Examples</a>
    <a href='/css/css_examples.asp'>CSS Examples</a>
    <a href='/w3css/w3css_examples.asp'>W3.CSS Examples</a>
    <a href="/js/js_examples.asp" target="_top">JavaScript Examples</a>
    <a href="/js/js_dom_examples.asp" target="_top">HTML DOM Examples</a>

我必须将输出表示为

&#34;要显示的文字&#34;使用sed工具。

    <a[\s]href=('|")([^>]+)">((?:.(?!\<\/a\>))*.)<\/a>

这是我的正则表达式,它捕获文本和href链接。

这是我写的sed命令

sed -E "s/\"<a[\s]href=('|\")([^>]+)\">((?:.(?!\<\/a\>))*.)<\/a>\"/\[\2\] \(\1\)/" mdlinks.txt

但这给了我错误。 有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

使用面向行的工具解析html通常会失败。鉴于您的简单布局,您可以尝试

tr -s "<" ">" < mdlinks.txt | cut -d">" -f3

答案 1 :(得分:0)

这不是正则表达式(或任何其他字符串操作工具)的工作。您需要能够解析html的工具。使用xsltproc的示例:

1)安装xsltproc包(如果需要)

2)编写此xsl文件,描述如何转换html输入:stylesheet.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="text" encoding="UTF-8"/>
    <xsl:template match="//a">[<xsl:value-of select="text()"/>] (<xsl:value-of select="@href"/>)</xsl:template>
</xsl:stylesheet>

3)将原始文件或原始html内容放在变量中(让我们说&#34; CONTENT&#34;),但不是mdlinks.txt(此步骤无用且在html内容中使用greping链接容易出错,浪费时间(至少5个小时))并写道:

xsltproc --html --novalid stylesheet.xsl <(echo "$CONTENT")

您获得:

[Google.com] (http://google.com)
[An Example] (http://example.com/files.html)
[File #23] (file23.html)
[See my picture!] (images/mypic.png)
[Email Joel] (mailto:joelross@uw.edu)

链接:http://scott.dd.com.au/wiki/XSLT_Tutorial