1

次のような形式の単純な XML があります。

<event>
    zappo
</event>
<event>
    wappo
</event>

「イベント」要素のいずれかのコンテンツを返す単純な Bash 関数が必要です。この関数は、次のような方法で使用できます。整数 (2) を使用して、返す要素を指定します。

command:
    myFunction myFile.txt 2
output:
    wappo

私はプログラム XMLStarlet にある程度精通していますが、Linux にあるより標準的なツールを使用してこれを行う必要があります。これについて正しい方向に向けてもらえますか?

4

3 に答える 3

0

perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[0]' < file.xml

印刷されます:

zappo

perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[1]' < file.xml

版画

 wappo

ただし、有効な xml が必要です。xml は有効な XML ではなく、有効な xml-fragment のみです。したがって、ファイルが本当に上記のようなものである場合は、次のようにコマンドを実行できます。

(echo '<root>';cat file.xml;echo '</root>') | perl -0777 -MXML::Simple -nlE '$x=XMLin($_);say $x->{event}->[0]'

perlただし、モジュールをインストールしてインストールする必要がありXML::Simpleます。

于 2013-07-23T16:17:14.847 に答える
0

xmlparser は安全な方法です。

何らかの理由でテキスト処理ツールを使用する必要がある場合、 awk はこれで機能しますが、ファイル形式が質問の形式に厳密に従っていることを確認する必要があります。

awk -v n="$idx" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' file

(シェル変数である可能性があります)を渡すだけで$idx、適切なブロックが出力されます。例えば:

kent$  cat f
<event>
 one
</event>
<event>
   two
</event>
<event>
    three
    sss
</event>
<event>
    four
</event>


kent$  awk -v n="3" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' f
    three
    sss 
kent$  awk -v n="2" '/<event>/{++i;p=1;next}/<\/event>/{p=0}p&&i==n{print}' f
   two
于 2013-07-23T15:47:19.647 に答える
0

でこのようなことを試すことができますがGNU awk、解析用awksedはないことに注意してください。xmlこのような作業に最適な専用ツールがあります。

ではawk、次のことができます。

awk 'NR==2*n' n="2" RS='</?event>' ORS='' xml

テスト:

$ cat xml
<event>
 one
</event>
<event>
   two
</event>
<event>
    three
    sss
</event>
<event>
    four
</event>
$ awk 'NR==2*n' n="2" RS='</?event>' ORS='' xml

   two
$ awk 'NR==2*n' n="3" RS='</?event>' ORS='' xml

    three
    sss
$ awk 'NR==2*n' n="4" RS='</?event>' ORS='' xml

    four
于 2013-07-23T16:03:24.240 に答える