Shell 命令-从 xml 文件中提取字符串

Shell 命令-从 xml 文件中提取字符串

有一个函数 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 数据。是一。

给定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

不要使用sedregex解析HTML/XML您不能也不能使用旨在处理原始文本行的工具来解析任何结构化文本(例如 XML/HTML)。如果需要处理 XML/HTML,请使用 XML/HTML 解析器。绝大多数语言都内置了对解析 XML 的支持,并且有专门的工具,例如xidelxmlstarlet或者xmllint如果您需要从命令行 shell 快速进行操作。 如果您无法访问适当的工具,请不要接受工作。

是目前最先进的命令行 XML/HTML 解析器。

xmlstarlet他的语法比xmllint你知道的更直观查询语言:

xidel -e '//version/(@value||""||@revision)' -s file.xml
GPK5B
GPK5

相关内容