【问题标题】:how to read xml file in linux如何在linux中读取xml文件
【发布时间】:2014-04-28 21:03:08
【问题描述】:

我有一个如下的 xml 文件,我需要使用一些 unix 命令“en”。

        <void method="put">
            <string>LANGUAGE</string>
            <string>en</string>
        </void>    

使用以下命令(从谷歌的某个链接获得),

sed -n '/string/{s/.*<string>//;s/<\/string.*//;p;}' Locale.xml

我得到的输出为

LANGUAGE
en

所以我用了

sed -n '/string/{s/.*<string>//;s/<\/string.*//;p;}' Locale.xml | tail -1

但是 sed 中是否有任何选项可以让我只获得第二个值?

【问题讨论】:

  • 使用 XML 解析器可能是更好的选择。
  • xpath 的确切用例。如果您需要使用 shell 脚本包装它,您可以使用工具 xmllint--xpath。在查看您的文档结构之前,我无法提供进一步的建议。如果您希望脚本稳定,请不要尝试在 xml 上使用 awk/sed/grep。好吧,您可以使用它们进行快速而肮脏的拍摄/测试。
  • XML 不是正则语言,这意味着您无法有效地将其结构与正则表达式匹配。

标签: linux sed csh


【解决方案1】:

使用xmlstarlet

$ cat x.xml 
<?xml version="1.0"?>
<void method="put">
  <string>LANGUAGE</string>
  <string>en</string>
</void>
$ xmlstarlet sel -t -c '/void/string[2]/text()' x.xml
en

或使用xmllint

$ xmllint --xpath '/void/string[2]/text()' x.xml
en

More about XPath.

【讨论】:

    【解决方案2】:

    你可以用这个sed

    sed -n '/LANGUAGE/{N; s/.*<string>\(.*\)<\/string>.*/\1/p; }' Locale.xml
    

    【讨论】:

      【解决方案3】:

      您可以搜索LANGUAGE 并打印下一行:

      awk -F"[<>]" '/LANGUAGE/ {getline;print $3}' Locale.xml 
      en
      

      或者搜索string并打印最后一个:

      awk -F"[<>]" '/string/ {f=$3} END {print f}' Locale.xml
      en
      

      【讨论】:

        【解决方案4】:

        使用xsh

        open file.xml ;
        echo //void[string="LANGUAGE"]/string[2]
        

        【讨论】:

          猜你喜欢
          • 2013-02-14
          • 1970-01-01
          • 2021-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多