쉘 명령 - xml 파일에서 문자열 추출

쉘 명령 - 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를 인쇄합니다.

\<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

sed사용 하거나 regex구문 분석 하지 마십시오HTML/XML원시 텍스트 줄을 처리하도록 설계된 도구를 사용하면 구조화된 텍스트(예: XML/HTML)를 구문 분석할 수 없으며 구문 분석할 수도 없습니다. XML/HTML을 처리해야 하는 경우 XML/HTML 파서를 사용하세요. 대부분의 언어에는 XML 구문 분석 지원 기능이 내장되어 있으며, 예를 들어 명령줄 셸에서 빠르게 수행해야 하는 경우 특수 도구가 있습니다 xidel. 적절한 도구에 접근할 수 없다면 일자리를 수락하지 마세요.xmlstarletxmllint

현재 가장 발전된 명령줄 XML/HTML 파서입니다.

xmlstarlet그의 문법은 xmllint당신이 아는 것보다 더 직관적 이다쿼리 언어:

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

관련 정보