0

このトピックに関する最初の質問は、情報が不足しているためクローズされました。したがって、いくつかの詳細を追加して、これをもう一度尋ねます。

xml ファイルから 1 つのタグで指定された値を抽出する必要があり、ksh を使用してそれを行う必要があります (これは perl で解決できますが、ksh で行う必要があり、xmlsh などのサードパーティのツールは使用できません)。

サンプル.xml

<?xml version="1.0" standalone="yes" ?>
<parent_one>
  <parent_two>
    <Pool>
      <pool_name>ABC</pool_name>
      <percent_full>79</percent_full>
      <pool_state>Enabled</pool_state>
    </Pool>
    <Pool>
      <pool_name>DEF</pool_name>
      <percent_full>40</percent_full>
      <pool_state>Enabled</pool_state>
    </Pool>
    <Pool>
      <pool_name>XYZ</pool_name>
      <percent_full>40</percent_full>
      <pool_state>Disabled</pool_state>
    </Pool> 
    <Totals>
      <total_tracks>4546456</total_tracks>
      <percent_full>48</percent_full>
    </Totals>
  </parent_two>
</parent_one>

対応する pool_state タグが有効になっているため、ksh スクリプトは sample.xml を読み取り、pool_name タグから ABC、DEF を出力する必要があります。pool_state タグが無効になっているため、XYZ を出力しないでください。

ksh スクリプトは sample.xml を読み取り、次のように出力します。

ABC

防御力

これは ksh で実行可能ですか、それとも perl を使用する必要がありますか?

4

3 に答える 3

0

そうは言っても (適切な XML パーサーなしで XML を解析しようとすることについての私のコメント)、純粋な ksh ではなく、sed/awk を使用して試してみましょう。この回答を基盤として、に設定され<Pool></Pool>ているすべてのブロックを削除し、タグ間の値を含む行を取得してキャプチャします。ファイルがサンプルのように見える場合、これは機能するはずですが、そうでない場合は間違いなく壊れます。pool_stateDisabledpool_namexml

awk '
    /<Pool>/ { rec=""; f=1 }
    f {rec = rec $0 ORS}
    /<\/Pool>/ {
        if (f && (rec !~ "<pool_state>Disabled</pool_state>"))
            printf "%s", rec
            f=0
    }' sample.xml |
grep pool_name |
sed 's#.*>\([^<]*\)<.*#\1#g'

すべてを 1 つの awk スクリプトに収めることもできますが、私はこの方が理解しやすいと考えました (OK、私は怠け者です)。

于 2013-04-08T17:34:06.337 に答える