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

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

Re: [shell-script] Obter texto contido num padrao


From: Salviano de Araujo Leão
Subject: Re: [shell-script] Obter texto contido num padrao
Date: Mon, 10 Sep 2007 20:28:42 -0300
User-agent: KMail/1.9.7

On Monday 10 September 2007 15:16:53 Tiago Barcellos Peczenyj wrote:

Valeu Thiago, não conheço awk, mas vou ler algo para me inteirar.
Surpreendentemente no caso de linhas contendo somente expressões:
 
\section*{ \textcolor{red}{Argumentos Matriciais 4} }

ele se perdeu fornecendo somente. 

\section*{ Argumentos Matriciais 4} }

Uma outra questão. Já que está em awk como ficaria um 
loop para que eu pudese trocar todas as cores, ou seja,
xxx poderia ser qualquer um dos valores blue, red, yellow, etc, 
de uma lista.

> Vejamos
>
> Partindo do exemplo do texto:
>
> $ cat texto
> \textcolor{xxx}{Texto texto1 \emph{texto2 \footnote{texto3}}
> texto4 \emph{texto5} texto6 \textsf{texto7} texto8
> texto9. }
>
> Eu uso o AWK para gerar comandos do SED
>
> $ awk -f remove.awk texto
> 1s/\\textcolor{xxx}{//;
> 3s/^\(.\{8\}\)}/\1/;
>
> Eu posso então testa-lo no arquivo:
>
> $ awk -f remove.awk texto | sed -f - texto
> Texto texto1 \emph{texto2 \footnote{texto3}}
> texto4 \emph{texto5} texto6 \textsf{texto7} texto8
> texto9.
>
> Humm... parece bom :)
>
> Vejamos o que eu fiz (remove.awk)
>
> BEGIN{IN = 0}  # IN representa o meu estado
> /textcolor/ && IN == 0{
>         IN=1
>
>         color = "textcolor{xxx}{"
>
>         printf "%ds/\\\\%s//;\n",NR,color
>
>         i = match($0,color);
>
>         $0 = substr($0,i+RLENGTH)
> }
> IN != 0 {
>         while(match($0,"[{}]")){
>                 i=RSTART
>
>                 IN += (substr($0,i,1) == "{") ? 1 : -1
>
>                 if (IN == 0){
>                         printf "%ds/^\\(.\\{%d\\}\\)}/\\1/;\n",NR,i - 1
>                         break
>                 }
>                 $0=substr($0,i+1)
>         }
> }
>
> Vou resumir: o problema re resume a retirar parte do texto
> "\textcolor{xxx}{" e a respectiva "}" que fecha esse texto.
>
> O começo, via SED, é facil, dificil é remover a respectiva "}" ... não sei
> como fazer com SED, mas com awk é facil, vc procura todas as ocorrencias de
> { ou } e vai contando. toda vez que aparecer um { eu  adiciono um valor, e
> todo } eu subtraio. Controlo isso no atributo IN -- ou seja, quando maior o
> valor de IN, mais "dentro" eu estou dos { { } }
>
> Sabendo a posição e linha do ultimo } que quero eliminar, fica facil.
>
> Eu poderia fazer tudo via AWK, porém... pensei em apimentar um pouco essa
> relação. Perceba que é facil usar apenas AWK, porem gerar codigo SED a
> partir do AWK pode ser vantajoso também :)
>
> On 9/10/07, Salviano de Araujo Leão <address@hidden> wrote:
> >   Olá a todos
> >
> > Tenho textos LaTex do tipo:
> >
> > \textcolor{xxx}{Texto texto1 \emph{texto2 \footnote{texto3}}
> > texto4 \emph{texto5} texto6 \textsf{texto7} texto8
> > texto9. }
> >
> > Gostaria que ele ficasse da seginte forma:
> >
> > Texto texto1 \emph{texto2 \footnote{texto3}}
> > texto4 \emph{texto5} texto6 \textsf{texto7}
> > texto8 texto9.
> >
> > Eu quero remover a seqüência \textcolor{xxx}{TEXTO}
> > preservando o texto dentro. Entretanto eu não sei
> > quantos ninhos de chaves TEXTO pode conter.
> >
> > Acredito que há uma solução com o sed.




reply via email to

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