【问题标题】:Shell Script to extract the value from XML file用于从 XML 文件中提取值的 Shell 脚本
【发布时间】:2016-07-15 15:52:10
【问题描述】:

任何人都可以帮助我编写 shell 脚本以从以下 xml 中查找值:-

<?xml version="1.0" encoding="UTF-8"?>
<log>
<logentry revision="36">
    <author>XYZ</author>
    <date>2014-07-15T14:47:18.328479Z</date>
    <paths>
        <path action="A" localPath="ABC" kind="unknown">/branches/ABC</path>
        <path action="A" localPath="ABC" kind="unknown">/branches/ABC</path>
        <path action="M" localPath="DEF" kind="unknown">/branches/CDF</path>
        <path action="M" localPath="DEF" kind="unknown">FRG</path>
    </paths>
    <msg>added</msg>
</logentry>
</log>

我想提取 localPath 的值,即“ABC”和“DEF”作为输出并写入一个文件。

【问题讨论】:

  • 顺便说一句,您真的对完全相同的文件进行两次添加,然后进行两次不同的修改吗?我想知道对sort -u 步骤的感知需求是否是您匿名化的产物,而不是真实数据可能发生的事情。

标签: xml shell


【解决方案1】:

使用可识别 XML 的工具。例如:

$ xmllint --xpath '/log/logentry/paths/path/@localPath' file.xml 

输出:

 localPath="ABC" localPath="ABC" localPath="DEF" localPath="DEF"

你可以进一步处理

$ xmllint --xpath '/log/logentry/paths/path/@localPath' file.xml \
  | sed 's/"/\n/g;' \
  | grep -v '^ ' \
  | sort -u

得到

ABC
DEF

或使用xsh

open file.xml ;
$h := hash @localPath /log/logentry/paths/path ;
for { keys %$h } { echo (.) ; }

输出:

ABC
DEF

【讨论】:

  • xmllint --xpath 的输出格式是否具有足够强大的保证以使以下字符串操作向前兼容?
  • @CharlesDuffy:我不知道,这也是我在此处包含输出的原因。
  • @choroba:感谢您的回复。我试图运行命令 xmllint --xpath '/log/logentry/paths/path/@localPath' file.xml ,但似乎 --xpath 不可用。它给了我错误未知选项--xpath。你能告诉我解决这个问题还是我需要使用任何其他选项。?
  • @user6376225:你可以尝试升级xmllint。
【解决方案2】:

...或者,XMLStarlet:

xmlstarlet sel -t -v /log/logentry/paths/path/@localPath -n

...发射:

ABC
ABC
DEF
DEF

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2015-11-04
    • 2019-10-15
    • 2011-08-14
    相关资源
    最近更新 更多