[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/