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

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

Re: [shell-script] Contador dentro do Sed


From: Tiago Peczenyj
Subject: Re: [shell-script] Contador dentro do Sed
Date: Fri, 25 Aug 2017 15:50:00 +0200

Ola

eu esqueci de falar de uma vantagem:

se vc executa o sed dentro de um loop, vc vai invocar o programa 300 vezes. como cada execução é um processo unix diferente, o resultado vai ser um pouco mais lento ( em maquinas atuais ) do que vc gerar um script sed que faça tudo o que vc quer ( pois vc executou o sed apenas uma vez ).

e vc ainda pode auditar o script sed para ver se ele realmente faz o que vc espera

com awk vc pode fazer? pode. mas vai ser um trabalho pois vc vai ler um xml linha a linha e vc precisa: analisar se ela contem o padrão, modificar uma parte exata, imprimir, etc. vai ser mais imperativo e menos declarativo. é uma questão de estilo - eu acho demasiado complicado.

se o xml fosse algo muito importante eu pensaria em usar linguagens capazes de processar xml - com bibliotecas adequadas e bem testadas. mas a sua modificação é simples, podemos tratar como um arquivo texto.


2017-08-25 14:56 GMT+02:00 Tiago Tarifa address@hidden [shell-script] <address@hidden>:
 

Obrigado pelas respostas!
Vou tentar responder todos em um e-mail só:
@Paulo
Obrigado Paulo, no seu segundo e-mail já deu certo. Gostei da ideia do decremento da variável. É algo simples mas nem tinha passado pela minha cabeça.

@Itamar
Itamar do céu! Acabei de me apaixonar pela awk! kkkk
Enquanto a gente engatinha aqui você vem correndo uma maratona!
Muito legal!!!!! Também resolveu e de uma forma muito rápida!

@Tiago
Xará, sua solução também foi legal, ficou bem rápido!
Esse script do sed seria uma alternativa se fosse só sed porque evita o loop em shell (havia me esquecido do awk)

Obrigado a todos mais uma vez, resolveu meu problema e de quebra ganhei mais conhecimento.

Tiago Tarifa Munhoz

Em 25 de agosto de 2017 05:13, Tiago Peczenyj address@hidden [shell-script] <address@hidden.br> escreveu:
 

Ola

só pude responder o email agora. quando eu vi a primeira tentativa eu percebi de cara 2 erros.

o principal é que se vc faz o for partindo de 0 ( ou 1 ) e ir incrementando, vc cai uma situação indefinida logo no segundo passo.

por exemplo, se vc começa com i = 0 vc faz

troca nItem="0" por nItem="1"

e agora vc tem 2 nItem="1" e o segundo passo vai ser confuso. o phfbettega respondeu corretamente 

Agora sobre a solução, vc pode usar shell pra criar um script sed - imagine este arquivo

bash$ cat teste.xml 
<det nItem="0">
<det nItem="1">
<det nItem="2">
<det nItem="3">
<det nItem="4">
<det nItem="5">
<det nItem="6">
<det nItem="7">
<det nItem="8">
<det nItem="9">

vamos gerar um sed q mude o 9 para 10,  o 8 para 9 .. até o 0 virar 1 -- como vc precisa

bash$ for i in `seq 10 -1 1`; do 
   j=$[ $i - 1 ] ; 
   echo "s/nItem=\"$j\"/nItem=\"$i\"/" ; 
done 

s/nItem="9"/nItem="10"/
s/nItem="8"/nItem="9"/
s/nItem="7"/nItem="8"/
s/nItem="6"/nItem="7"/
s/nItem="5"/nItem="6"/
s/nItem="4"/nItem="5"/
s/nItem="3"/nItem="4"/
s/nItem="2"/nItem="3"/
s/nItem="1"/nItem="2"/
s/nItem="0"/nItem="1"/

agora vamos salvar isso em um arquivo

bash$ for i in `seq 10 -1 1`; do j=$[ $i - 1 ] ; echo "s/nItem=\"$j\"/nItem=\"$i\"/" ; done  > change.sed

e vamos aplicar no seu xml, salvando um backup

bash$ sed -i.old -f change.sed teste.xml 

veja as alterações -- agora só falta adaptar para 300

bash$ cat teste.xml
<det nItem="1">
<det nItem="2">
<det nItem="3">
<det nItem="4">
<det nItem="5">
<det nItem="6">
<det nItem="7">
<det nItem="8">
<det nItem="9">
<det nItem="10">

enquanto o arquivo original foi preservado. se vc não precisa vc pode usar sed -i apenas, sem o .old

bash$ cat teste.xml.old 
<det nItem="0">
<det nItem="1">
<det nItem="2">
<det nItem="3">
<det nItem="4">
<det nItem="5">
<det nItem="6">
<det nItem="7">
<det nItem="8">
<det nItem="9">



2017-08-24 22:36 GMT+02:00 Tiago Tarifa address@hidden [shell-script] <address@hidden.br>:
 

Fala pessoal!
Estou com um arquivo xml de venda (CF-e) desses aparelhos que emitem cupom fiscais, os SAT.
O arquivo tem um campo nItem que numera os itens dentro dessa venda. O campo é assim: <det nItem="1">

Esse arquivo está com 300 itens começando do 0 até o 299:
<det nItem="0">
...
<det nItem="299">

quando o correto seria:
<det nItem="1">
...
<det nItem="300">

Eu tentei, de uma forma inocente, fazer um for com um contador e chamar o sed para ir alterando esse campo mas não deu certo e ficou lento demais.

Gostaria de saber como faço um contador dentro do Sed para ele ir alterando esses campos, sem precisar do Shell. (Ou se precisar, que ele não atrapalhe)

Obs.: A titulo de curiosidade, o código que fiz e não deu certo foi este:
for ((i=0;i<300;i++))
do
  num=$((i+1))
  sed -i 's/<det nItem="'"$i"'">/<det nItem="'"$num"'">/' 300produtos.xml
done

Como podem ver esse código dá m....

Valeu

Tiago Tarifa Munhoz




--
Tiago B. Peczenyj

http://about.me/peczenyj





--
Tiago B. Peczenyj

http://about.me/peczenyj

reply via email to

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