[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] Obter texto contido num padrao
From: |
Tiago Barcellos Peczenyj |
Subject: |
Re: [shell-script] Obter texto contido num padrao |
Date: |
Mon, 10 Sep 2007 15:16:53 -0300 |
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.
>
>
--
Tiago B Peczenyj
Linux User #405772
http://peczenyj.blogspot.com/
[As partes desta mensagem que não continham texto foram removidas]
Re: [shell-script] Obter texto contido num padrao,
Tiago Barcellos Peczenyj <=