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

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

Re: [shell-script] Pattern Matching : sed, grep, awk .....


From: aurelio
Subject: Re: [shell-script] Pattern Matching : sed, grep, awk .....
Date: Thu, 10 Apr 2003 16:06:38 -0300 (ART)

ae thobias,

pessoal: desculpem o cross-posting pra sed-br, mas o assunto é
         pertinente.

 --- Thobias Salazar Trevisan <address@hidden> escreveu: 
> On Wed, 9 Apr 2003, Rodrigo F. Baroni wrote:
> 
> >      Por favor, alguem poderia explicar (ou indicar
> > alguns links) sobre essa "simbologia" para cruzar
> > pattern matching (expressoes regulares), utilizadas na
> > vastidao dos *IX - como no sed, grep, ..etc; por
> > exemplo no comando postado numa msg anterior :
> >
> > sed '/<a/,/>/{:a;s/\(href[^>]\+\)ç/\1c/g;ta;}' <--
> 
> posso tentar te explicar este sed:
> 
> /<a/,/>/, pegamos um intervalo, no caso de '<a' ateh '>'
> e somente neste intervalo realizamos os demais comandos;
> :a label
> s/\(href[^>]\+\)ç/\1c/ substitui um grupo que contem href mais
> qualquer caracter diferente de '>' repetidos pelo menos 1vez
> ateh encontrar um ç. trocamos pelo grupo criado '\1' mais o
> caracter c;
> ta, se a substutuicao obteve sucesso, pula pro label a.
> 
> Acho que nao fui muito claro. 

grande thobias, se me permite a intromissão, deixa eu tentar
ajudar.

rodrigo, o que o thobias fez nesse sed foi magia negra :)

a parte do endereço tudo bem, normal, mas na parte de trocar
o 'ç' por 'c' é que ele usou uma tática avançada.

vamos usar um exemplo mais fácil que TAGs HTML nem sempre
são didáticas. na string imaginária:

     Eu sou o sed. Sou meio complicadinho, mas sou limpinho.

o problema era algo como "trocar as letras 'o' por '#', mas
somente entre o primeiro ponto final até encontrar a vírgula.
fora disso deixa como está." então o resultado desejado seria:

     Eu sou o sed. S#u mei# c#mplicadinh#, mas sou limpinho.

a substituição normal 's/o/#/g' não se aplicaria neste caso,
pois ela substituiria TODAS as letras 'o' da frase, inclusive
as que estariam antes do ponto e após a vírgula.

para resolver isso, o que o thobias fez foi "ancorar" o escopo
da substuituição na vírgula, de maneira que fora da área
delimitada, nada fosse trocado. o comando dele nesse nosso
exemplo seria:

   :loop  ;  s/\(\.[^,]\+\)o/\1#/  ;  t loop

o ':loop' é apenas uma marcação e o 't loop' é quem dizer pro sed
voltar até aquela marcação. aqui fazemos um loop.

e no comando s/// está a mágica. vamos vê-lo sem os escapes e
espaçado:

   s  /  (.[^,]+)o  /  \1#  /

então estamos procurando a partir de um ponto . tudo menos a
vírgula ->  .[^,]+     seguido imediatamente de um 'o'.
ou seja, este trecho: 
   
   . Sou meio complicadinh

e mais a letra 'o'. note que como o .[^,]+ foi colocado entre
parenteses, isso formar um grupo. então toda a frase acima
está "guardada" no grupo um (1).

depois tudo isso é trocado por \1#, sendo o \1 uma representação
do conteúdo do grupo 1 e o # é um caractere normal.

pode parecer redundante (e é), mas estamos trocando:

   . Sou meio complicadinh + o

por:

   . Sou meio complicadinh + #

feito isso, o sed cai no loop e começa tudo de novo, dessa vez
trocando:
 
    . Sou meio c  + o

por:

    . Sou meio c  + #

e assim vai, voltando ao começo da frase até acabarem as
letras 'o' depois do ponto e antes da vírgula.

ufa! o sed do thobias faz exatamente a mesma coisa, só que
os delimitadores deles ao invés de serem o ponto e a 
vírgula são 'href=' e '>'. e ele chamou a marcação do loop
de ':a'. compare:

        :loop  ;  s/\(\.[^,]\+\)o/\1#/     ;  t loop
        :a     ;  s/\(href[^>]\+\)ç/\1c/g  ;  t a

blz?


> Mas vc pode encontrar informacoes
> sobre expressoes regulares online no livro de ER do aurelio ou
> comprar o livro para ajuda-lo a ficar milionario! :-)

é! aí eu poderei dizer:

 - Sou o Sr. Aurélio o milionário. Possuo uma mansão e um hiate. :)

valeu a força thobias!

> Eh um livro exclusivo sobre o assunto. MUITO BOM!!!!
> Da uma (ops) conferida:
> http://www.verde666.org/er/
> ops! novo link :)
> http://aurelio.net/er/

pois é. eu ainda tou no atropelo da mudança, e conto com a
ajuda de todos pra divulgar isso e arrumar todos os links
que apontam pro sed-HOWTO, pras funções ZZ e outros...

se vir algum site (inclusive o meu!) com o link apontando pro
verde666.org, avise o webmaster, ou me avise que eu tentarei
entrar em contato com ele.

por enquanto ainda vai funcionar os dois endereços, mas atualizar
é importante porque o verde666.org vence agora em junho e
sairá fora do ar, então os links vão ficar QUEBRADOS.

desculpem a mensagem 1/2 ontopic 1/2 offtopic, mas eu quiz
aproveitar o gancho e não importunar a lista depois.

falouzz!



=====
-- 
ATENCAO: o www.verde666.org vai morrer, use www.aurelio.net
ATTENTION: www.verde666.org is no more, use www.aurelio.net

_______________________________________________________________________
Yahoo! Mail
O melhor e-mail gratuito da internet: 6MB de espaço, antivírus, acesso POP3, 
filtro contra spam. 
http://br.mail.yahoo.com/


reply via email to

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