PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : sed: RegExp zum ersetzen von Zeichen außerhalb von HTML-Tags



crocodilechris
06-11-2009, 17:49
Hallo Community,

ich möchte mit sed ne HTML-Datei in eine reine ASCII-Datei ändern.
Dass die Umlaute u.ä. Zeichen ersetzt werden hab ich hinbekommen, nur bei der zusätzlichen Ersetzung der Anführungszeichen ( " ) durch " komme ich nicht voran.

sed 's/\"/\"/g'
Ich bekomme einfach keinen regulären Ausdruck hin, sodass nach Anführungszeichen gesucht wird, die nicht in der Zeichenkette <.*> liegen. :(

Gruß,
crocodilechris

zst
06-11-2009, 19:00
Hallo,

nur so als Idee, vielleicht löst es deine Probleme viel einfacher:
html2text - an advanced HTML-to-text converter
Habe ich bei SUSE mit drauf.
Gruss zst

crocodilechris
06-11-2009, 21:34
mh, kommt leider nicht in Frage, brauch das distributionsunabhängig und ohne Fremdtools.
Würde das eben gerne mit dem sed machen, oder nem anderen built-in-Tool, wenn sonst nicht möglich.
Achso, außerdem soll es ja weiterhin ne html sein, nur eben rein ASCII-formatiert, ohne Umlaute und sowas.

Ich hoffe darauf, dass es nen regulären Ausdruck dafür gibt, nur den bekomm ich leider nicht selber hin. :(

Edit:
vlt gibt es ja ne möglichkeit den Ausdruck, der die HTML-Tags rausfiltert aus dem gesuchten rauszunehmen:

(<[^>]*>)

undefined
07-11-2009, 16:31
Ich verwende für solche Geschichten immer xsltproc


< ? xml version = '1.0' encoding = 'utf-8' ? >
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:reg="http://exslt.org/strings"
extension-element-prefixes="reg">

<!-- Undefined http://www.hjcms.de, (C) 2007-2010 -->

<xsl:output version="1.0"
method="xml"
encoding="utf-8"
indent="yes"
media-type="application/xhtml+xml"
doctype-system = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
doctype-public = "-//W3C//DTD XHTML 1.0 Transitional//EN"
/>

<xsl:template match="*" mode="txt">
<xsl:variable name="tmp1" select="reg:replace(text(),'ä','ae')" />
<xsl:variable name="tmp2" select="reg:replace($tmp1,'ö','oe')" />
<xsl:variable name="tmp3" select="reg:replace($tmp2,'ü','ue')" />
<xsl:value-of select="$tmp3" />
<xsl:apply-templates select="*" mode="html" />
</xsl:template>

<!-- Copy -->
<xsl:template match="*" mode="html">
<xsl:element name="{name()}">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:for-each>
<xsl:choose>
<xsl:when test="text()">
<xsl:apply-templates select="." mode="txt" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="./*" mode="html" />
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>

<!-- Main -->
<xsl:template match="/">
<xsl:apply-templates select="./*" mode="html" />
</xsl:template>

</xsl:stylesheet>




xsltproc --output out.html strip2ascii.xslt input.html

crocodilechris
09-11-2009, 00:01
Ist das nicht nen bisschen viel Aufwand?
Wie wärs mit folgenden Zeilen in ner Datei, die Dann beim sed als Skript-File angegeben wird:

# Umlaute konvertieren
s/ä/\&auml;/g;
s/Ä/\&Auml;/g;
s/ö/\&ouml;/g;
s/Ö/\&Ouml;/g;
s/ü/\&uuml;/g;
s/Ü/\&Uuml;/g;
# S-Zet ersetzen
s/ß/\&szlig;/g;
# Anfuehrungszeichen ersetzen
#s/>[^<]*\"</\&quot;/g;
# ... e setzen
s/\.\.\./\&hellip:/g
Also wie folgt:

sed -f regeln input > output
Und leider ersetzt deine Methode auch nicht die Anführungszeichen in &quot; oder?
Außerdem sehe ich grad, dass das Programm auf dem Server wo ich es anwenden will garnicht drauf ist :(

undefined
09-11-2009, 14:37
Ist das nicht nen bisschen viel Aufwand?
..............
Außerdem sehe ich grad, dass das Programm auf dem Server wo ich es anwenden will garnicht drauf ist :(
1) Das was du jetzt möchtest ist nicht ASCII sondern "Spezial Entitiy Chars"
2) Das ist ein Beispiel und nicht fertig, fertige Scripte gibt es nicht um sonst ;)
3) Wenn auf deinem Server keine libxslt Installiert ist wundert mich das. Ohne die geht so gut wie kaum etwas gnome,udev,docbook etc.

Der Aufwand ist auch nicht mehr als bei deinem Scripts, mit dem zusatz das er dir alle html Seiten Sauber formatiert ;)

crocodilechris
16-11-2009, 19:49
Das sollte auf nem alten Unix-Server in der Uni laufen, ....
Naja, habs aufgegeben die Anführungszeichen zu ersetzen, wenn ich im Laufe des Semesters noch ne Idee bekomme, dann werde ich die gefundene Lösung mal präsentieren, ...
Solange versuch ich mich mit anderen Aufgaben fortzubilden, eventuell hilft die Distanz ja auch ne Lösung zu finden, oder die dann hoffentlich neu erworbenen Unix/Linux-Kenntnisse :)