我正在尝试在两个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'
但没有得到我想要的东西。我希望打印内容如下: ... ...
有人可以帮忙吗?
答案 0 :(得分: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
答案 1 :(得分:1)
又快又脏:
sed -e'1,/<page.*query="test environment">/ d' -e'/<\/page>/,$ d' abc1.xml
答案 2 :(得分:0)
我建议使用xml
解析器。这里有一个perl及其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>