仅 Grep 那些带有 " 的行..." 其下一行包含特定标签和值

仅 Grep 那些带有 " 的行..." 其下一行包含特定标签和值

通过使用,grep我只希望所有 xml 文件中包含<active>true</active>标签的行以及之后的下一行应该是<codePool>community</codePool>.

示例 XML 文件如下所示:

<?xml version="1.0"?>
<config>
    <modules>
        <Company_Module>
            <active>true</active>
            <codePool>core</codePool>
            <depends>
                <Company_Module2 />
            </depends>
        </Company_Module>
    </modules>
</config>

但文件夹中类似的文件有很多,XML结构都是一样的。

我当前的grep命令是:

grep -rl '<active>true</active>' --include='*.xml' --color=always

如何在命令行搜索中实现此目的?

答案1

假设所有 XML 文件都在当前目录中并且与模式匹配*.xml,并且它是文件名您想要的包含指定 XML 的文件:

$ xml sel -t -i '/config/modules/Company_Module[active = "true" and codePool = "community"]' -f -nl ./*.xml

这使用XML小星( xml,但有时安装为xmlstarlet) 这是一个命令行 XML 解析工具。

它尝试匹配指定的 XPath 表达式,如果匹配,则输出包含匹配 XML 的输入文件的文件名。

由于它使用 XML 解析器,因此它独立于节点内标签的顺序<Company_Module>

答案2

好吧,我不想离开grep我使用了这么久的命令。

所以我找到了一种方法来做到这一点,就在下面的东西:

grep -rzl '<active>true</active>.*<codePool>community</codePool>' --include='*.xml' --color=always

这对我来说效果很好。

答案3

grep -A1 "<active>" *.xml

A1 -> 打印图案和下一行。

相关内容