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).