0

次のような2つのXMLタグ間のデータをフェッチしようとしています

<page size="10" seconds="184" name="TEST_ONE" query="test environment">
  <content1>...</content1>
  <content2>...</content2>
</page>

私が試してみました

cat ABC.XML | grep -oP '(?<=<page size="10" seconds="184" name="TEST_ONE" query="test environment">).*?(?=</page>)'

しかし、私は何も得ません。私もsedで試しました

sed -e 's/<page size="10"\(.*\)page/\1/g'

しかし、私が望んでいたものは得られませんでした。以下のようにコンテンツを印刷したい: ... ...

誰かがこれを助けることができますか?

4

3 に答える 3

1

xmlstarlet救助へ!

xmlstarlet sel -t -v 'page' ABC.XML

他のあらゆる種類の書式設定とクエリのオプションがあります。

サブ要素が必要な場合は、使用します

xmlstarlet sel -t -c 'page/*' ABC.XML

そして、他の回答へのコメントであなたの「クエリ」回答を考えると:

xmlstarlet sel -t -c "page[@query='test environment']/*" ABC.XML
于 2013-11-13T14:13:32.023 に答える
0

xmlパーサーを使用することをお勧めします。ここに、とそのXML::Twigモジュールの例があります。

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

XML::Twig->new(
    twig_roots => {
        'page[@query = "test environment"]/*' => sub { $_->print },
    },  
    pretty_print => 'indented',
)->parsefile( shift );

次のように実行します。

perl script.pl xmlfile

これにより、次の結果が得られます。

<content1>...</content1>
<content2>...</content2>
于 2013-11-13T13:52:20.820 に答える