Em 25/09/06, Rodrigo Tavares<[EMAIL PROTECTED]> escreveu:
> Estou testando o sed, no trecho de codigo abaixo
> mostra o sed subtituindo o diretorio local, por
> sequencia de TABs ? Tem um pedaço que mostra
> substituindo no começo da linha do TAB  ?
> Estou meio perido nesse comando, e a variavel de
> retorno aperece com um tab. Alguem pode explicar esse
> trecho ?
> grepconf () {
>         w="     " # space tab
>         sq=/etc/squid/squid.conf
>         # sed is cool.
>         res=`sed -ne '
>          s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
>                 t end;
>                 d;
>                 :end q' < $sq`
>         [ -n "$res" ] || res=$2
>         echo "$res"
> }

Olá,

  Podemos primeiro entender a expressão regular que seleciona a linha
de interesse:
  - Como é difícil ver espaço e tabulação, vamos aditir que espaço
seja =e= e tabulação _t_
  - Assim $w = "=e=_t_", isto é, um espaço e uma tabulação
  - Para também ajudar a ver as coisas, vamos trocar $1, que é o
primeiro parâmetro passado para a função por -1-
  - A expressão '^'$1'['"$w"']\+\([^'"$w"']\+\).*$' sem as apas e
barras que complicam um pouco ficaria '^-1-[=e=_t_]+([^=e=_t_]+).*$'
  - Olhando para a expressão "despoluída" acima até o primeiro
parenteses, vemos que somente serão selecionadas as linhas que iniciem
com -1- seguido de espaço(s) e/ou tabulação(ões). Este plural de
espaços e/ou tabulações é dado pelo sinal de +, que significa pelo
menos um caracter que o antecede, quase como o *, porém o * significa
a possibilidade de ausência do caracter que o antecede. O caracter que
antece o + pode ser =e= ou _t_, sendo este "ou" devido à eles estarem
entre colchetes.
  - Dentro dos parenteses, temos a diretiva de seleção, no caso a
primeira seleção, onde serão selecionados os caracateres que "casem"
com [^=e=_t_]+. Esse ^ dentro dos colchetes significa caracteres que
difrentes dos que estão entre os colchetes e o + estende isso, isto é,
selecionar os caracteres enquanto forem diferentes de =e= e _t_.
  - Após os parentes temos .*$, o $ acho que não tem sentido ae, se
alguém souber o real sentido, que nos explique. O ponto siginifica
qualquer caracter e o * que pode haver zero ou mais, isto é, tudo.
  - Conclusão: esta expressão regular seleciona os caracteres que
estiveres entre espaços ou tabulações de uma linha que inicia por -1-
(primeiro parâmetro passado para a função) seguido de pelo menos um
espaço ou tabulação.

  Próximo passo é analisar o sed então:
  - Na parte "s/expressão/\1/p", a parte "\1/p" diz para retornar a
seleção (\1 = primeira)
  - "t end" diz que se der certo "s/expressão/\1/p", vai para o ponto ":end"
  - "d" diz para passar para a próxima linha
  - ":end q" diz que estamos no ponto "end" e execute a diretiva "q",
que é terminar o sed
  - Conclusão: se deu certo "s/expressão/\1/p", retorna a primeira
seleção e sai, senão vai lendo a próxima linha.

  "< $sq" diz que o arquivo de entrada para o sed tem seu nome na
variável de ambiente sq.

  Em    [ -n "$res" ] || res=$2   ,  nos diz que se não tiver resposta
do sed, o resultado é o segundo parâmetro ($2) passado para a função.

  echo "$res"  ------>    [EMAIL PROTECTED]   :D

  Espero que tenha ajudado.   ;)

-- 
Atenciosamente

           Claudio Polegato Junior

           Engenheiro Autônomo - Ribeirão Preto e Região
           Mestre em Física Aplicada à Medicina e Biologia - USP
           Engenheiro Computacional - USP
           Engenheiro Eletrônico - USP

Um peregrino de problemas; Um pergaminho de soluções!
---------------------------------------------------------------------------
Esta lista é patrocinada pela Conectiva S.A. Visite http://www.conectiva.com.br

Arquivo: http://bazar2.conectiva.com.br/mailman/listinfo/linux-br
Regras de utilização da lista: http://linux-br.conectiva.com.br
FAQ: http://www.zago.eti.br/menu.html

Responder a