我有以下文件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


只有当XPath表达式本身位于XML文件(如XSLT样式表)中时才表示换行符。 我怀疑这里发生了什么,当你说
translate(message,'
' ,'@')
在命令行中, '
'
被视为一个五个字符的字符串,因此,你告诉translate
替换&
与@
,也取代所有#
, x
, a
和;
什么都没有
尝试使用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, "@")'
我写了所有这些,从解析器到查询引擎,所以它没有依赖关系,在所有的系统上表现都一样。