¿Por qué este comando sed no logra obtener el resultado deseado?

¿Por qué este comando sed no logra obtener el resultado deseado?

archivo de prueba:

872iirji -- RANDOM STUFF -- skjkfj45j
GET /_ajax_htmlview?action=28&__and_so_on HTTP/1.1.
Host: my.website.com.
connection: blah blah blah
skjfkjfj

salida deseada:

_ajax_htmlview?action=28&__and_so_on
my.website.com

al cual me uniré usando sed backreferences para hacerlohttp://my.website.com/_ajax_htmlview?action=28&__and_so_on

sed -n 's=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
        h
        /^Host/{
        s=.*:[ \t]*\(.*\).=\1=
        H
        x
        p
}'

pero me sale esto:

Host: my.website.com
my.website.com

EDITAR: si agrego /^GET/{ }lo siguiente, entonces parece funcionar, pero ¿cómo funciona esto y el anterior no?

sed -n '/^GET/{
        s=GET \/\(_ajax_htmlview[^ ]*\).*=\1=
        h
        }
        /^Host/{
        s=.*:[ \t]*\(.*\).=\1=
        H
        x
        p
}' testfile

Respuesta1

Bueno, solo por diversión, solución awk obligatoria....

Desarrollé este bash oneliner que también funciona

buildit(){ Req=$(grep -oP '(?<=GET \/).*(?=HTTP)' $1); url=$(awk -F":" '/Host/{gsub(/ /, "",$2); print $2}' $1); echo "http://"$url"/"$Req; }

Esto crea una función bash en tu shell que luego puedes llamar así

$ buildit testfile
http://my.website.com/_ajax_htmlview?action=28&__and_so_on

Sin embargo, hay una advertencia: esto solo funcionará si solo hay una instancia de "Host" y "GET" en el archivo.

Respuesta2

Más fácil con awk:

$ awk '/GET.*ajax/ { print $(NF-1); getline; print $NF }' testfile
/_ajax_htmlview?action=28&__and_so_on
my.website.com.

El awkcódigo busca cualquier línea de solicitud GET que también contenga la cadena ajax, luego genera el penúltimo campo de esa línea y lee la siguiente línea. A partir de la siguiente línea, genera el segundo campo.

información relacionada