다음과 같은 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 데이터를 구문 분석합니다.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
히델현재 가장 발전된 명령줄 XML/HTML 파서입니다.
xmlstarlet
그의 문법은 xmllint
당신이 아는 것보다 더 직관적 이다xpath쿼리 언어:
xidel -e '//version/(@value||""||@revision)' -s file.xml
GPK5B
GPK5