有一个函数 Parse_xml 如下
Parse_XML()
{
TDIR=$1
_VERSION=
_REVISION=
_FILENAME=
_COMPONENT=
_DESCRIPT=
_ISITOA=0
_NOLOG=0
_OAVERSION=
local TMP=/tmp/tmpfile.txt-$$
local JUNK
# find the cpq_package XML file and assign it to file
local file=
for xmlfile in *.xml
do
if [ -n "$(head ${xmlfile} | grep '<cpq_package')" ] ; then
file="${xmlfile}"
break
fi
done
if [ -z "${file}" ] || [ ! -f "${file}" ]
then
_NOLOG=1
return
fi
${echo} `grep \<version $file|awk -F = '{print $2}'|awk '{print $1}'|tr -d '"'` > $TMP
read _VERSION JUNK < $TMP
${echo} `grep \<version $file|awk -F '=' '{print $3}'|awk '{print $1}'|tr -d '"'` > $TMP
read _REVISION JUNK < $TMP
_OAVERSION=${_VERSION}
_VERSION=${_VERSION}${_REVISION}
这里是从该行的 xml 文件中获取的版本和修订版本
<version value="GPK5" revision="B" type_of_change="1"/>
<version value="GPK5" revision="" type_of_change="1"/>
这里有些修订是空字符串,有些有 1 个字符,所以命令
grep \<version CP057761.xml|awk -F = '{print $2}'|awk '{print $1}'|tr -d '"'
正在从 xml 获取所有版本并将其存储在 TMP 文件中。并命令
grep \<version CP057761.xml|awk -F '=' '{print $3}'|awk '{print $1}'|tr -d '"'
正在从不同版本的 xml 中获取所有版本标头的修订版本。
因此,有时如果获取先前版本的修订版并将其添加到具有空修订版的版本中。
我如何修改这个命令
${echo} `grep \<version $file|awk -F = '{print $2}'|awk '{print $1}'|tr -d '"'` > $TMP
read _VERSION JUNK < $TMP
${echo} `grep \<version $file|awk -F '=' '{print $3}'|awk '{print $1}'|tr -d '"'` > $TMP
read _REVISION JUNK < $TMP
_OAVERSION=${_VERSION}
_VERSION=${_VERSION}${_REVISION}
仅搜索 xml 文件中 _VERSION 变量中的值并获取其特定版本。因此,当它有修订时,_VERSION 打印 GPK5B,当它为空时,_VERSION 打印 GPK5。
我通过在修订版本的 grep 中搜索 $_VERSION 来解决这个问题,而不是 \<version.它只为我获取了该特定版本的修订版并读取 _REVISION JUNK $TMP 为我获取了修订版 所以基本上我只想要最新的修订版和版本。抱歉,我之前的问题没说清楚。
答案1
使用 XML 解析器来解析 XML 数据。xmlstarlet是一。
给定file.xml
包含
<root>
<version value="GPK5" revision="B" type_of_change="1"/>
<version value="GPK5" revision="" type_of_change="1"/>
</root>
然后
xmlstarlet sel -t -m '//version' -v '@value' -v '@revision' -n file.xml
输出
GPK5B
GPK5
答案2
不要使用sed
或regex
解析HTML/XML
您不能也不能使用旨在处理原始文本行的工具来解析任何结构化文本(例如 XML/HTML)。如果需要处理 XML/HTML,请使用 XML/HTML 解析器。绝大多数语言都内置了对解析 XML 的支持,并且有专门的工具,例如xidel
、xmlstarlet
或者xmllint
如果您需要从命令行 shell 快速进行操作。 如果您无法访问适当的工具,请不要接受工作。
希德尔是目前最先进的命令行 XML/HTML 解析器。
xmlstarlet
他的语法比xmllint
你知道的更直观xpath查询语言:
xidel -e '//version/(@value||""||@revision)' -s file.xml
GPK5B
GPK5