シェルコマンド - 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

関連情報