Sed [RESOLVIDO]

1. Sed [RESOLVIDO]

Tiago Campos
tiagotrevo

(usa Mandrake)

Enviado em 20/09/2007 - 10:13h

Alguem pode me dizer o q realmente esse linha faz:

host="$(echo $QUERY_STRING | sed 's/\(.*=\)\(.*\)\(\&.*\)/\2/')"


Obrigado.


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 22/09/2007 - 22:17h

s/\(.*=\)\(.*\)\(\&.*\)/\2/

Como diria Jack, vamos por partes.
s = procura
/ separador dos campos.

/\(.*=\)\(.*\)\(\&.*\)/ Regra do que está procurando

/\2/ Pelo que substituir, se achar.

\(.*=\)
Qualquer caracter (ponto) que ocorra zero ou mais vezes (efeito do *) seguido de igual.

Isto casa com:
=
a=
abbbb=
Se encontrar, a presenca dos parenteses em SCAPE determina que é para GUARDAR isto na variavel interna no sed. Como é a primeira sequencia de parenteses, ela será a variável 1.


\(.*\)
Agora procura por realmente QUALQUER COISA, que ocorra uma ou mais vezes e salva na variavel 2.

\(\&.*\)/

Agora procura por um caractere & seguida de zero ou mais caracteres e salva na variavel 3 (CRITICA: quanto desperdício de variável!!!)

No final, ao achar tudo isto, troca TUDO pelo que tem armazenado na variavel 2 apenas.

Exemplo:

teste=pedro&fulano=caca

teste= eh armazenado na variavel 1
pedro eh armazenado na variavel 2 (observe, apos o = e ate o &, pela regra)
Tudo que vier apos o & entra na variavel 3.

Como a regra de substituicao eh \2 (troca pela 2)
tudo isto vai virar apenas pedro.

Ufa.
É no espírito de pra que facilitar se você pode complicar. Tudo o que esta expressão faz é obter o primeiro valor (após o igual) da primeira variável passada por QUERY_STRING em uma requisição HTTP. Só que ela além de confusa é falha: só funciona se tiver Várias variáveis!

Eu preferiria:

sed 's/^[^=]\+=//;s/\&.\+$//'

Que apenas LIMPA o que tem antes do igual e depois de & (se existir).





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts