2013-02-19 6 views
6

Mam następujący plik log.xml:xmlstarlet - usuwanie wysuwu wiersza

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

na CentOS 5.4 używając xmlstarlet 1.0.1 jeśli uruchomić następującą komendę, usuwając wysuw w message:

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

wynik to:

Line [email protected] Line 2 and so on 

Na CentOS 6 przy użyciu xmlstarlet:

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

będę otrzymywać:

Line 1 
    Line 2 nd so on 

Uwaga "i" skonwertowany do niczego. Przypuszczam, że to nie problem xmlstarlet, ale raczej pewna zmiana w libxslt.

Wszelkie pomysły, jak to naprawić?

UPDATE

Dodany problem z transformacji literą "A" do niczego.

+0

http://stackoverflow.com/a/6651469/825783 może być trafny. –

+0

@EeroHelenius Nie jestem pewien, czy to ten sam problem :( – dimba

+0

Nie wiem na pewno, ale może zakończenia linii są inne niż się spodziewasz: http: // sourceforge.net/mailarchive/message.php? msg_id = 28142284 –

Odpowiedz

6

Problem ten można rozwiązać w sposób ogólny, definiując zmienną zawierającą wartość przerwy linia:

następnie użyć tej zmiennej jako drugi argument funkcji Przetłumacz:

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

nie wiem o xmlstarlet, ale można spróbować Xidel:

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

Napisałem to wszystko, z parsera kwerendy silnik, więc nie ma zależności i zachowuje się tak samo na wszystkich systemach.

3

&#xa; reprezentuje tylko znak nowego wiersza, gdy wyrażenie XPath znajduje się w pliku XML (takim jak arkusz stylów XSLT). Podejrzewam, że to, co się tutaj dzieje jest to, że kiedy mówisz

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

w wierszu poleceń, '&#xa;' jest traktowany jako ciąg pięciu znaków, a więc mówisz translate zastąpić & z @ a także wymienić wszystko z #, x, a i ; bez niczego.

Spróbuj dosłownego przełamane za pomocą CTRL-V

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

(tj naciśnij Ctrl-V, a następnie powrotu karetki podczas wpisywania polecenia - pojawi się na ekranie jako ^M).

+0

Masz rację - interpretowane jako 5 znaków. Rozwiązanie, które zaproponowałeś, że nie działa – dimba

+0

@dimba Poszedłbym z odpowiedzią Pabla za pomocą zmiennej. –

Powiązane problemy