Meu conselho é "Não se incomode em tentar fazer isso com grep
" . Você poderia possivelmente criar um hack não baseado em regexp confiável em awk
ou perl
, mas as expressões regulares não podem ser confiavelmente usadas para analisar ou extrair dados do XML. E o que quer que você tenha criado provavelmente seria uma bagunça ilegível e inamovível. Existem maneiras melhores. Formas que realmente funcionam e funcionam de forma confiável.
Resumindo: não analise XML ou HTML com expressões regulares . não funciona .
Em vez disso, use um analisador xml como xmlstarlet . Como alternativa, use uma linguagem como perl
ou python
, ambas com várias bibliotecas de análise XML para escolher.
Se você realmente deseja processar XML com os favoritos da ferramenta orientada a linha grep
(ou melhor ainda, awk
ou perl
ou mesmo sed
), primeiro converta o xml em um formato orientado a linha com xml2 . Esta não é uma opção ruim para a extração muito simples de dados de arquivos XML.
por exemplo. Depois de corrigir os erros mais óbvios com o xml de amostra, veja o que parece após o processamento com xml2
:
$ xml2 < ajs.xml
/xml/test-result/@exectime=2017-07-07
/xml/test-result/@result=FAILURE
/xml/test-result/@isdone=TRUE
/xml/test-result/@logicalname=this.is.test1
/xml/test-result/@duration=10050
/xml/test-result/test-case/@testcasename=this.is.test.case.name1
/xml/test-result/test-case/@testunit=abcd-mc
/xml/test-result/test-case/@testpath=file:/this/is/the/file/path1/abcd.xml
/xml/test-result
/xml/test-result/@exectime=2017-07-07
/xml/test-result/@result=SUCCESS
/xml/test-result/@isdone=TRUE
/xml/test-result/@logicalname=this.is.test1
/xml/test-result/@duration=10050
/xml/test-result/test-case/@testcasename=this.is.test.case.name1
/xml/test-result/test-case/@testunit=abcd-mc
/xml/test-result/test-case/@testpath=file:/this/is/the/file/path1/uvwx.xml
Seria difícil conseguir o que você deseja usando apenas grep
, mas bastante fácil com perl
(apenas perl simples sem usar uma biblioteca XML) ou awk
, e não muito difícil com sed
.
Usando xmlstarlet
ou uma biblioteca de análise de XML em perl
ou python
ou o que seria ainda mais fácil. Todos esses métodos trabalham diretamente com os dados estruturados em um documento XML, ou seja, lidam com cada elemento XML como um objeto distinto com atributos e valores selecionáveis, não apenas um grupo de linhas que podem estar de alguma forma conectadas.
BTW, existem várias perguntas com boas respostas sobre xmlstarlet e xml2 aqui neste site.
Tanto o xml2
quanto o xmlstarlet
estão disponíveis pré-empacotados para a maioria das distribuições do Linux.
Por fim, tente começar com pelo menos XML razoavelmente bem formado. Seu exemplo de XML acima tem várias falhas. Entradas XML quebradas, incompletas ou abaixo do padrão serão muito difíceis de serem analisadas com qualquer ferramenta.