【问题标题】:Shellscript Read XML attribute valueShellscript 读取 XML 属性值
【发布时间】:2014-10-19 22:30:19
【问题描述】:

我们想从 XML 文件中读取 XML 属性。文件内容示例如下:

<properties>
  <property name="abc" value="15"/>
  <property name="xyz" value="26"/>
</properties>

我们想使用 shell 脚本读取属性“abc”的值(即 15)。
请建议 shell 命令来实现这一点。

【问题讨论】:

  • 到目前为止你有什么尝试?你到底想要什么?如果您调用 func(abc) 则返回 15 的函数?或解析文件并返回 abc 15, xyz 26, ... 的函数?
  • 最好使用 xml 解析器而不是 sed 或 awk。
  • 你可以看看xmlstarlet解析XML文件,它支持XPath。

标签: bash shell awk sed


【解决方案1】:

sed -n '/&lt;property name="abc"/s/.*value="\(.*\)"[^\n]*/\1/p' file

为该值创建一个保持模式,然后匹配除换行符之外的所有内容以避免打印换行符,它期望根据您的示例数据双引号的值。

E.g. 
<properties>
  <property name="abc" value="15"/>
  <property name="xyz" value="26"/>
</properties>

Output:
15

(编辑前:sed '/&lt;property name="abc"/s/.*value="\(.*\)"[^\n]*/\1/' file

【讨论】:

  • 这不起作用它给出的输出为 15
  • 我的错误,它应该有 print 和 -n 在那里: sed -n '/
【解决方案2】:

又快又脏

sed -n '/<Properties>/,\|</properties>| {
   s/ *<property name="xyz" value="\([^"]*\)"\/>/\1/p
   }'

没有 xml 检查并根据您的示例假设相同的结构(每行一个属性名称,...)

posix 版本(--posix 用于 GNU sed)

【讨论】:

    【解决方案3】:

    您可以使用适当的 XML 解析器,例如 xmllint。如果您的版本支持 xpath,那么获取特定值将非常容易。如果它不支持 xpath,那么你可以像这样使用--shell 选项:

    $ echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxml
    / >  -------
     value="15"
    / > 
    

    然后您可以使用awksed 格式化并从输出中提取所需的字段。

    $ echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxmlfile | awk -F'[="]' '!/>/{print $(NF-1)}'
    15
    

    您可以通过以下方式使用命令替换来捕获变量中的输出:

    $ myvar=$(echo 'cat //properties/property[@name="abc"]/@value' | xmllint --shell myxml | awk -F'[="]' '!/>/{print $(NF-1)}')
    $ echo "$myvar"
    15
    

    使用 xmlparser 以外的任何东西都容易出错并且很容易出错。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多