Grep apenas as linhas com “active… / active” cuja próxima linha contém tag e valor específicos

0

Ao usar grep , só quero essas linhas de todos os arquivos xml que contenham <active>true</active> tags e a próxima linha depois disso deve ser <codePool>community</codePool> .

Um exemplo de arquivo XML seria como abaixo:

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

Mas há muitos como esses arquivos na pasta, a estrutura XML é a mesma.

Meu comando atual grep é:

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

Como posso conseguir isso na pesquisa de linha de comando?

    
por Vicky Dev 10.11.2016 / 11:02

3 respostas

2

Supondo que todos os arquivos XML estejam no diretório atual e correspondam ao padrão *.xml e que sejam os nomes de arquivos que você deseja dos arquivos que contêm o XML especificado:

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

Isso usa XMLStarlet ( xml , mas algumas vezes instalado como xmlstarlet ), que é uma ferramenta de análise XML de linha de comando.

Ele tenta corresponder à expressão XPath especificada e, se corresponder, exibe o nome do arquivo de entrada que continha o XML correspondente.

Como está usando um analisador XML, é independente da ordem das tags no nó <Company_Module> .

    
por 05.01.2017 / 13:14
-1

Bem, eu não queria deixar o comando grep que usei por tanto tempo.

Então eu encontrei uma maneira de fazer isso com algo abaixo de:

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

Isso funcionou bem para mim.

    
por 10.11.2016 / 11:23
-1
grep -A1 "<active>" *.xml

A1 - > imprima o padrão e a próxima linha.

    
por 05.01.2017 / 16:52