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