0

我有一堆 XML 文件,每个文件的格式...

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <R>
        <B></B>
        <Q></Q>
        <U></U>
    </R>
    ...
</A>

我需要在每个中搜索字符串,并返回整个元素“R”。问题是字符串中有新行,所以我不能使用 grep -B n -A n 因为每个搜索结果之前和之后的行数可能不同

例如,给定以下...

<?xml version="1.0" encoding="UTF-8"?>
<A>
    <R>
        <B>abc</B>
        <Q>0123</Q>
        <U>xyz</U>
    </R>
    <R>
        <B>
            qwe
            rty
            yui
        </B>
        <Q>0123</Q>
        <U>
            zxc
            abc
        </U>
    </R>
    <R>
        <B>lkj</B>
        <Q>
            lkjhgfdsa
            wer
        </Q>
        <U>
            poixyz
            zaq
        </U>
    </R>
</A>

如果我 grep 为“xyz”,那么我需要得到......

<R>
    <B>abc</B>
    <Q>0123</Q>
    <U>xyz</U>
</R>
<R>
    <B>lkj</B>
    <Q>
        lkjhgfdsa
        wer
    </Q>
    <U>
        poixyz
        zaq
    </U>
</R>

我不反对使用 perl、egrep 等其他工具来实现这一点。任何和所有的帮助将不胜感激。

4

2 回答 2

1

是的,它可以在 Perl 中完成,例如使用XML::XPathxpath附带的可执行文件:

xpath a.xml '//R[.//*[contains(text(),"xyz")]]'

或使用基于XML::LibXML的替代方案,例如我的(此站点不允许我链接到它) :

xpath-rp -e '//R[.//*[contains(text(),"xyz")]]' a.xml

另一种选择是xmlstarlet

xmlstarlet sel -t -c '//R[.//*[contains(text(),"xyz")]]' a.xml

PS:这些只是daxim答案的替代品。我不知道 xml_grep2,我会立即安装它!要点是在这里使用 XPath 是个好主意。

于 2013-04-27T16:43:13.977 回答
1

学习XPath并使用xml_grep2

$ xml_grep2 -x '//*[text()[contains(string(.),"xyz")]]/ancestor::R' nvanwyen.xml

<R>
        <B>abc</B>
        <Q>0123</Q>
        <U>xyz</U>
    </R>
<R>
        <B>lkj</B>
        <Q>
            lkjhgfdsa
            wer
        </Q>
        <U>
            poixyz
            zaq
        </U>
    </R>
于 2013-04-27T21:15:15.810 回答