2013-02-19 9 views
6

Ich habe die folgende Datei log.xml:xmlstarlet - Entfernen von Zeilenvorschub

<entry> 
    <message>Line 1 
    Line 2 and so on</message> 
</entry> 

auf CentOS 5.4 mit xmlstarlet 1.0.1, wenn ich den folgenden Befehl ausführen, während Zeilenvorschub in message Entfernung:

xml sel -t -m //entry -v "translate(message,'&#xa;' ,'@')" log.xml 

Der Ergebnis ist:

Line [email protected] Line 2 and so on 

Auf CentOS 6 mit xmlstarlet:

1.3.1 
compiled against libxml2 2.7.6, linked with 20706 
compiled against libxslt 1.1.26, linked with 10126 

Ich werde erhalten:

Line 1 
    Line 2 nd so on 

Note "und" umgewandelt zu nichts. Ich nehme an, es ist kein Problem von xmlstarlet, sondern eher eine Änderung von libxslt.

Irgendwelche Ideen, wie man es repariert?

UPDATE

Added Problem mit "a" zu nichts von Buchstaben verwandeln.

+0

http://stackoverflow.com/a/6651469/825783 könnte relevant sein. –

+0

@EeroHelenius Nicht sicher, es ist das gleiche Problem :( – dimba

+0

Weiß nicht sicher, aber vielleicht sind die Zeilenenden anders als Sie erwarten: http: // sourceforge.net/mailarchive/message.php? msg_id = 28142284 –

Antwort

6

Sie können dies in einer durch die Definition einer variablen allgemeine Art und Weise lösen, den Wert eines Zeilenumbruch enthalten:

Dann diese Variable als das zweite Argument der übersetzen Funktion:

xml sel -t -m //entry 
     --var linebreak -n --break 
     -v "translate(message, \$linebreak ,'@')" 
     log.xml 
1

Ich weiß nicht, über xmlstarlet, aber man konnte Xidel versuchen:

xidel log.xml -e '//message/translate(., $line-ending, "@")' 

Ich schrieb alles, von Parser-Engine abzufragen, so dass es keine Abhängigkeiten hat und verhält sich auf allen Systemen gleich.

3

&#xa; stellt nur ein Zeilenvorschubzeichen dar, wenn der XPath-Ausdruck selbst in einer XML-Datei (z. B. einem XSLT-Stylesheet) enthalten ist. Ich vermute, dass hier etwas passiert also, wenn Sie

translate(message,'&#xa;' ,'@') 

auf der Kommandozeile sagen, wird die '&#xa;' als fünf Zeichenfolge behandelt wird, und damit doch sagen Sie translate& mit @ zu ersetzen und auch alle ersetzen von #, x, a und ; mit nichts.

Versuchen Sie, eine wörtliche Newline ctrl-V

xml sel -t -m //entry -v "translate(message,'<ctrl-V><CR>' ,'@')" log.xml 

(das heißt drücken Sie Strg-V, gefolgt von Wagenrücklauf, wenn Sie den Befehl eingeben - es auf dem Bildschirm als ^M angezeigt) verwendet wird.

+0

Sie haben Recht - interpretiert als 5 Zeichen. Lösung, die Sie vorgeschlagen haben, nicht funktioniert – dimba

+0

@dimba Ich würde mit Pablos Antwort mit einer Variablen gehen. –

Verwandte Themen