shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Ajuda com regex e laço


From: Fabiano Caixeta Duarte
Subject: Re: [shell-script] Ajuda com regex e laço
Date: Mon, 15 Feb 2010 16:37:38 -0200

Em 15 de fevereiro de 2010 16:09, Cristiano <address@hidden> 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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]