【问题标题】:get specific value from xml file using bash script使用 bash 脚本从 xml 文件中获取特定值
【发布时间】:2021-03-20 22:20:19
【问题描述】:

我不熟悉 bash 和字符串,需要从 xml 文件中获取值, 卷曲我得到的 xml 后:

<metadata modelVersion="1.1.0">
  <groupId>com.company.NYC</groupId>
  <artifactId>scripts</artifactId>
  <version>2.3.7-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20201209.102124</timestamp>
      <buildNumber>38</buildNumber>
    </snapshot>
    <lastUpdated>20201209104133</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <classifier>NYC</classifier>
        <extension>zip</extension>
        <value>2.3.7-20201209.102124-38</value>
        <updated>20201209102124</updated>
      </snapshotVersion>
      <snapshotVersion>
        <classifier>tests</classifier>
        <extension>jar</extension>
        <value>2.3.7-20201209.102124-38</value>
        <updated>20201209102124</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>2.3.7-20201209.102124-38</value>
        <updated>20201209102124</updated>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>

使用这个命令,我得到版本标签值:

#wget -q -N $urlversion=$(curl -s https://www.artifactoty.company.net/artifactory/maven-dev-local/com/google/api/framework/maven-metadata.xml --insecure | grep  -oP '(?<=<value>).*?(?=</value>))

我需要的只是压缩文件后的值:

extension>zip</extension>
<value>2.3.7-20201209.102124-38</value>

2.3.7-20201209.102124-38 值。

我怎么能单独得到它。

感谢朋友。

【问题讨论】:

标签: xml bash shell awk


【解决方案1】:

假设 OP 有理由不使用支持 XML 的工具来解析数据...

注意:我已将示例 xml 数据复制到文件 tag.xml 中,以便回答此问题。

一个awk解决方案:

awk -F'[<>]' '             # define multiple field delimiters as "<" and ">"
$3=="zip" {getline         # if field #3 = "zip" then read the next line and ...
           print $3        # print field #3
           exit}           # at this point we have what we want so exit
' tag.xml

折叠成单行并存储在变量中:

zipver=$(awk -F'[<>]' '$3=="zip" {getline; print $3; exit}' tag.xml)
echo "${zipver}"

以上都生成:

2.3.7-20201209.102124-38

OP 可以修改当前命令如下:

wget -q -N $urlversion=$(curl -s ... | awk -F'[<>]' '$3=="zip" {getline; print $3; exit}')

【讨论】:

    【解决方案2】:

    使用 xmlstarlet:

    curl ... | xmlstarlet sel -t -v "metadata/versioning/snapshotVersions/snapshotVersion/value" | head -1
    

    获取curl命令的输出并通过xmlstarlet进行处理。使用sel选择所有值的路径,然后只打印第一个值(对应zip)

    【讨论】:

      【解决方案3】:

      don't use regex to parse XML
      当 url 仍然有效时(目前不适用于我),您可以使用 和 XPath 表达式来获得您想要的:

      xidel -s "<url>" -e '//snapshotVersion[extension="zip"]/value'
      2.3.7-20201209.102124-38
      

      【讨论】:

        猜你喜欢
        • 2021-03-10
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 2019-10-15
        • 1970-01-01
        • 2015-05-01
        相关资源
        最近更新 更多