次の 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