使用bash脚本从xml文件中获取特定值



我不熟悉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>))

我所需要的只是zip文件后的值:

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

2.3.7-201209.1022124-38值。

我一个人怎么能得到它。

谢谢朋友们。

假设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}')

使用xmlstarlet:

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

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

请不要使用正则表达式解析XML
当url仍然有效时(目前对我来说不起作用(,你可以使用xidel和XPath表达式来获得你想要的:

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

所以,不管怎样,你都得到了这个:

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

给定:
$echo"var1";扩展>拉链2.3.7-201209.102124-38

这能让你得到你想要的:

$ echo "$var1" |tail -1|cut -d">" -f2 |cut -d"<" -f1
2.3.7-20201209.102124-38

相关内容

  • 没有找到相关文章