2016-04-11 16 views
-2

Ich schrieb einen Regex-Code, um Anker-Tags aus einer HTML-Datei zu extrahieren und bekam diese Ausgabe.So lösen Sie diese sed Syntax Problem

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> 

Ich habe die Ausgabe als

darzustellen "Text anzuzeigen" das Sed Werkzeug.

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

Dies ist meine Regex, die den Text und href Link erfasst.

Hier ist der sed Befehl i

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

Aber das gibt mir Fehler. Kann mir bitte helfen?

+0

Welche Fehler bekommen Sie? Und wie sieht die gewünschte Ausgabe aus? – tink

+0

Sie versuchen, eine Regexp-Variante zu verwenden, die nicht von sed oder einem anderen Standard-UNIX-Tool unterstützt wird (vielleicht ist es ein PCRE? Idk). Poste einen [mcve], damit wir dir helfen können. –

+0

Sie können nicht-einfangende Gruppen '(?:)' Mit sed nicht verwenden. –

Antwort

0

versuchen Das ist kein Job für regex (oder jede andere String-Manipulation-Tool). Sie benötigen Werkzeuge, die HTML analysieren können. Ein Beispiel unter Verwendung von xsltproc:

1) installieren Sie das xsltproc Paket (falls erforderlich)

2) Notieren Sie sich diese xsl-Datei, die beschreibt, wie die HTML-Eingabe verwandeln: 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) Nehmen Sie sich Originaldatei oder Ihr ursprünglicher HTML-Inhalt in einer Variablen (sagen wir "CONTENT"), aber nicht mdlinks.txt (dieser Schritt ist nutzlos und greping Links in HTML-Inhalt ist fehleranfällig und eine Verschwendung von Zeit (mindestens 5 Stunden für Sie)) und schreiben Sie:

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

Sie erhalten:

[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:[email protected]) 

-Link: http://scott.dd.com.au/wiki/XSLT_Tutorial

0

Das Analysieren von HTML mit linienorientierten Werkzeugen schlägt normalerweise fehl. Angesichts Ihrer einfaches Layout, können Sie

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