2013-02-19 10 views
6

ho il seguente file log.xml:xmlstarlet - la rimozione di avanzamento riga

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

su CentOS 5.4 utilizzando xmlstarlet 1.0.1 se si esegue il seguente comando, durante la rimozione di avanzamento riga in message:

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

Il il risultato è:

Line [email protected] Line 2 and so on 

Su CentOS 6 utilizzando xmlstarlet:

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

riceverò:

Line 1 
    Line 2 nd so on 

Note "e" convertito a nulla. Suppongo che non sia un problema con xmlstarlet, ma piuttosto qualche cambiamento in libxslt.

Qualche idea su come risolverlo?

UPDATE

ulteriore problema con la trasformata di lettera "a" per niente.

+0

http://stackoverflow.com/a/6651469/825783 potrebbe essere rilevante. –

+0

@EeroHelenius Non sono sicuro che sia lo stesso problema :( – dimba

+0

Non lo so per certo, ma forse le terminazioni di linea sono diverse da quelle che ti aspetti: http: // sourceforge.net/mailarchive/message.php? msg_id = 28142284 –

risposta

6

È possibile risolvere questo in modo generale definendo una variabile contenente il valore di un'interruzione di linea:

quindi utilizzare tale variabile come secondo argomento della funzione translate:

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

Non so su xmlstarlet, ma si potrebbe provare Xidel:

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

Ho scritto tutto questo, dal parser per interrogare il motore, in modo da non ha dipendenze e si comporta allo stesso modo su tutti i sistemi.

3

&#xa; rappresenta solo un carattere di nuova riga quando l'espressione XPath è essa stessa in un file XML (come un foglio di stile XSLT). Ho il sospetto che quello che sta succedendo qui è che quando si dice

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

sulla riga di comando, il '&#xa;' viene trattato come una stringa di cinque caratteri, e quindi stai dicendo translate per sostituire & con @ e anche per sostituire tutti di #, x, a e ; con niente.

Prova andiamo a capo usando Ctrl-V

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

(cioè premere Ctrl-V seguita da ritorno carrello digitando il comando - apparirà sullo schermo come ^M).

+0

Hai ragione - interpretato come 5 caratteri. Soluzione che hai proposto di non funzionare – dimba

+0

@dimba Vorrei andare con la risposta di Pablo usando una variabile. –

Problemi correlati