0

我正在尝试获取两个 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

又快又脏:

sed -e'1,/<page.*query="test environment">/ d' -e'/<\/page>/,$ d' abc1.xml 
于 2013-11-13T14:38:31.063 回答
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 回答