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