xmlstarlet – 删除换行

我有以下文件log.xml

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

在使用xmlstarlet 1.0.1的CentOS 5.4上,如果我运行下面的命令,同时删除message换行符:

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

结果是:

 Line 1@ Line 2 and so on 

在使用xmlstarlet的CentOS 6上:

 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”的转换添加到空白的问题。

你可以通过定义一个包含换行符的变量来解决这个问题:

 --var linebreak -n --break 

然后使用该变量作为翻译功能的第二个参数:

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

&#xa; 只有当XPath表达式本身位于XML文件(如XSLT样式表)中时才表示换行符。 我怀疑这里发生了什么,当你说

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

在命令行中, '&#xa;' 被视为一个五个字符的字符串,因此,你告诉translate替换&@ ,也取代所有#xa; 什么都没有

尝试使用CTRL-V字面换行

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

(即按Ctrl-V后键入命令回车 – 它会出现在屏幕上^M )。

我不知道xmlstarlet,但你可以试试Xidel :

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

我写了所有这些,从解析器到查询引擎,所以它没有依赖关系,在所有的系统上表现都一样。