xmlstarlet-删除换行符
我有以下文件xmlstarlet-删除换行符,xml,linux,xmlstarlet,Xml,Linux,Xmlstarlet,我有以下文件log.xml: <entry> <message>Line 1 Line 2 and so on</message> </entry> 结果是: Line 1@ 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, l
log.xml
:
<entry>
<message>Line 1
Line 2 and so on</message>
</entry>
结果是:
Line 1@ 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的一些变化
有没有办法解决这个问题
更新
增加了将字母“a”转换为零的问题。我不知道xmlstarlet,但您可以尝试: 我写了所有这些,从解析器到查询引擎,所以它没有依赖性,在所有系统上的行为都是一样的
和#xa代码>仅在XPath表达式本身位于XML文件(如XSLT样式表)中时表示换行符。我怀疑这里发生的是当你说
translate(message,'
' ,'@')
在命令行上,”
;'代码>被视为一个五个字符的字符串,因此您告诉translate
用@
替换&
,并替换所有#
、x
、a
和代码>没有任何内容
使用ctrl-V尝试文字换行
xml sel -t -m //entry -v "translate(message,'<ctrl-V><CR>' ,'@')" log.xml
xmlsel-t-m//entry-v“translate(message,,'@')”log.xml
(即,键入命令时按ctrl-V键,然后按回车键-它将在屏幕上显示为^M
)。您可以通过定义一个包含换行符值的变量来解决此问题:
--var linebreak -n --break
然后将该变量用作translate函数的第二个参数:
xml sel -t -m //entry
--var linebreak -n --break
-v "translate(message, \$linebreak ,'@')"
log.xml
可能相关。@EeroHelenius不确定这是否是同一个问题:(不确定,但可能行尾与您预期的不同:您是对的-
;被解释为5个字符。您提出的解决方案不是这样的working@dimba我会用一个变量来支持Pablo的答案。不会翻译(消息“\n”,”)
或规范化空格(消息)
够了吗?
--var linebreak -n --break
xml sel -t -m //entry
--var linebreak -n --break
-v "translate(message, \$linebreak ,'@')"
log.xml