在 xml 文件 bash 脚本中搜索值
Search for value in xml file bash script
我有 xml 个文件:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>group</groupId>
<artifactId>project100</artifactId>
<versioning>
<latest>1.2.1-black</latest>
<release>1.2.1-black</release>
<versions>
<version>1.0.0</version>
<version>1.0.0-black</version>
<version>1.0.2</version>
<version>1.0.1</version>
<version>1.2.0</version>
<version>1.2.1-black</version>
</versions>
</versionsing>
</metadata>
我还有一个变量:$ID=1.0.2,我想检查这个 ID 是否存在于我的 xml 文件中。
我尝试这样的事情:
'cat ///metadata/versioning/version/text()' | xmllint --shell $content | grep -v "^/ >"
$contenet 是我的 xml 文件,但这显示 mi 是这样的:
warning: failed to load external entity "<version>1.0.0</version>
来自 xml 文件的每个实体。我不知道该怎么做。我对 bash 脚本
有点菜鸟
我认为 $content
包含文件的 contents,而您使用的工具希望您传递 name 的文件。它正在将您的 XML(如 <version>1.0.0</version>
)的每个 "word" 视为文件路径,但找不到文件路径,因此正在抱怨。
我还注意到您正在使用 --shell
,然后不得不使用 grep 删除提示。您可以通过直接使用 --xpath
来避免这种情况。
我建议尝试这样的事情:
echo "$content" | xmllint --xpath '//metadata/versioning/versions/version/text()' -
或者,如果您有手头文件的名称,那么就这样做:
xmllint --xpath '//metadata/versioning/versions/version/text()' file.xml
我认为 versionsing
是一个拼写错误,所以我在 XPath 中将其更改为 versioning
。我还添加了缺失的部分 versions/
(感谢 choroba)。
鉴于您正在尝试过滤到特定版本,我猜您想要这样的东西:
$ id=1.0.0
$ xmllint --xpath "//metadata/versionsing/versions/version[text() = '$id']/text()" file.xml
1.0.0
要查明给定版本是否存在,您可以这样做:
id=1.2.3
xpath="//metadata/versionsing/versions/version[text() = '$id']"
if xmllint --xpath "$xpath" file.xml 2>/dev/null
then
echo "version $id found"
else
echo "version $id not found"
fi
这将告诉您 ID 值是否存在于 XML 文件中:
$ grep -q $ID file.xml && echo exists
编辑
排除部分匹配:
$ grep ">${ID}<" file.xml && echo exists
我有 xml 个文件:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>group</groupId>
<artifactId>project100</artifactId>
<versioning>
<latest>1.2.1-black</latest>
<release>1.2.1-black</release>
<versions>
<version>1.0.0</version>
<version>1.0.0-black</version>
<version>1.0.2</version>
<version>1.0.1</version>
<version>1.2.0</version>
<version>1.2.1-black</version>
</versions>
</versionsing>
</metadata>
我还有一个变量:$ID=1.0.2,我想检查这个 ID 是否存在于我的 xml 文件中。 我尝试这样的事情:
'cat ///metadata/versioning/version/text()' | xmllint --shell $content | grep -v "^/ >"
$contenet 是我的 xml 文件,但这显示 mi 是这样的:
warning: failed to load external entity "<version>1.0.0</version>
来自 xml 文件的每个实体。我不知道该怎么做。我对 bash 脚本
有点菜鸟我认为 $content
包含文件的 contents,而您使用的工具希望您传递 name 的文件。它正在将您的 XML(如 <version>1.0.0</version>
)的每个 "word" 视为文件路径,但找不到文件路径,因此正在抱怨。
我还注意到您正在使用 --shell
,然后不得不使用 grep 删除提示。您可以通过直接使用 --xpath
来避免这种情况。
我建议尝试这样的事情:
echo "$content" | xmllint --xpath '//metadata/versioning/versions/version/text()' -
或者,如果您有手头文件的名称,那么就这样做:
xmllint --xpath '//metadata/versioning/versions/version/text()' file.xml
我认为 versionsing
是一个拼写错误,所以我在 XPath 中将其更改为 versioning
。我还添加了缺失的部分 versions/
(感谢 choroba)。
鉴于您正在尝试过滤到特定版本,我猜您想要这样的东西:
$ id=1.0.0
$ xmllint --xpath "//metadata/versionsing/versions/version[text() = '$id']/text()" file.xml
1.0.0
要查明给定版本是否存在,您可以这样做:
id=1.2.3
xpath="//metadata/versionsing/versions/version[text() = '$id']"
if xmllint --xpath "$xpath" file.xml 2>/dev/null
then
echo "version $id found"
else
echo "version $id not found"
fi
这将告诉您 ID 值是否存在于 XML 文件中:
$ grep -q $ID file.xml && echo exists
编辑 排除部分匹配:
$ grep ">${ID}<" file.xml && echo exists