【问题标题】:xmlstarlet - removing linefeedxmlstarlet - 删除换行符
【发布时间】:2013-02-19 08:06:00
【问题描述】:

我有以下文件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,'&#xa;' ,'@')" log.xml

结果是:

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”转换为空的问题。

【问题讨论】:

标签: xml linux xmlstarlet


【解决方案1】:

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

--var linebreak -n --break 

然后将该变量用作 translate 函数的第二个参数:

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

【讨论】:

【解决方案2】:

&amp;#xa; 仅在 XPath 表达式本身位于 XML 文件(例如 XSLT 样式表)中时表示换行符。我怀疑这里发生的事情是当你说

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

在命令行中,'&amp;#xa;' 被视为五个字符串,因此您告诉 translate 将 &amp; 替换为 @ 并替换所有 #、@ 987654328@、a 和 ; 什么都没有。

尝试使用 ctrl-V 换行

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

(即在键入命令时按 ctrl-V 后跟回车 - 它会在您的屏幕上显示为 ^M)。

【讨论】:

  • 你是对的 - 解释为 5 个字符。您提出的解决方案不起作用
  • @dimba 我会使用变量来接受 Pablo 的回答。
【解决方案3】:

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

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

我编写了从解析器到查询引擎的所有内容,因此它没有依赖关系,并且在所有系统上的行为都相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多