2013-02-19 70 views
6

我有以下文件log.xmlxmlstarlet - 消除換行符

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

在CentOS 5.4使用xmlstarlet如果我運行下面的命令1.0.1,而在message移除換行:

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

的結果是:

Line [email protected] Line 2 and so on 

在CentOS 6上使用xmlstarlet:

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

我會收到:

Line 1 
    Line 2 nd so on 

注 「和」 轉換成什麼。我想這不是xmlstarlet的問題,而是libxslt中的一些更改。

任何想法如何解決它?

UPDATE

新增問題,字母 「a」 不了了之的變換。

+0

http://stackoverflow.com/a/6651469/825783可能是相關的。 – 2013-02-19 10:32:22

+0

@EeroHelenius不知道這是同一個問題:( – dimba 2013-02-21 06:47:45

+0

不知道肯定,但也許行結局是你所期望的:http:// sourceforge。net/mailarchive/message.php?msg_id = 28142284 – 2013-02-21 10:07:48

回答

6

可以通過定義含有換行符的值的變量在一般的方式解決這個問題:

然後使用該變量作爲翻譯功能的第二個參數:

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

我不知道xmlstarlet,但你可以嘗試Xidel

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

我寫的這一切,從解析器查詢引擎,所以它沒有依賴關係,其行爲在所有系統上相同。

3

&#xa;僅當XPath表達式本身位於XML文件(例如XSLT樣式表)中時才表示換行符。我懷疑這裏發生了什麼,就是當你在命令行上說

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

,該'&#xa;'被視爲一個5個字符的字符串,因此你告訴translate@更換&也全部更換#,x,a;什麼也沒有。

使用CTRL-V嘗試字面換行符

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

(即按下Ctrl-V隨後回車鍵入命令時 - 這將在屏幕上顯示爲^M)。

+0

你是對的 - 解釋爲5個字符。你建議不工作的解決方案 – dimba 2013-02-21 16:20:23

+0

@dimba我會用Pablo的答案和變量一起去。 – 2013-02-21 16:35:19