Em 15 de fevereiro de 2010 16:09, Cristiano <[email protected]> escreveu: > Salve ilustres, boa tarde. > > Estou montando um script para extrair dados de um arquivo XML (nota fiscal > eletronica). > > Dentro do XML há um campo 'cProd'. Preciso do conteúdo dele, porém, podem > haver inúmeros registros cProd (mínimo de 1). Exemplo: > > (...) > <cProd>001</cProd> > <xProd>Nome do produto</xProd> > <cProd>002</cProd> > <xProd>Nome do outro produto</xProd> > (...) > <cProd>NNN</cProd> > <xProd>Nome do produto NNN</xProd> > (...) > > A extrutura do arquivo não está organizada hierarquicamente linha por linha > como no exemplo. É tudo uma única linha. > > Usei a seguinte regex: > > grep -Eo '<cProd>.*<\/cProd>' > > O problema é que esta regex casa com todo o conteúdo da primeira tag <cProd> > até a última tag </cProd>, retornando do código do primeiro produto e até o > último (NNN). > > Tenho 2 dúvidas: > > 1) O que posso colocar no lugar do '.*' para fazer ele pegar apenas o > primeiro campo "cProd", parando na primeira tag </cProd> que encontrar? > > 2) Uando esta regex, como posso criar um laço para extrair todos os campos > cProd do arquivo (pode vir com as tags junto, que eu me viro em removê-las)? > Algo que me dê o seguinte resultado: > > # extrai_codigo.sh nome_do_arquivo.xml > nome_do_arquivo.xml:501 > nome_do_arquivo.xml:502 > nome_do_arquivo.xml:503 > > Minha necessidade é pegar um diretório com N (leia-se trocentos) arquivos XML > e saber quais os códigos de produto em cada um deles. > > Abraço > > > Cristiano
Uma idéia: for i in *.xml; do echo -n "$i: " egrep -o '<cProd>[[:alnum:]]*<\/cProd>' $i|sed 's/<[[:alnum:]\/]*>//g'|paste -sd, done A saída: arq.xml: 001,002,NNN Na verdade, dá pra fazer o cerne do script só com sed, mas usei seu primeiro esforço com egrep para responder a pergunta feita. -- Fabiano Caixeta Duarte Especialista em Redes de Computadores Linux User #195299 Ribeirão Preto - SP
