Comment grep curl -I information d’en-tête

J’essaie d’obtenir le lien de redirection à partir d’un site en utilisant curl -I puis grep à “location”, puis je sed le texte de l’emplacement pour que je rest avec l’URL.

Mais cela ne fonctionne pas. Il affiche l’URL à l’écran et ne le met pas

 test=$(curl -I "http://www.redirectURL.com/" 2> /dev/null | grep "location" | sed -E 's/location:[ ]+//g') echo "1..$test..2" 

Qui produit alors:

 ..2http://www.newURLfromRedirect.com/bla 

Que se passe-t-il?

Comme @ user353852 le fait remarquer, vous obtenez un caractère de retour chariot à partir de curl qui curl que lorsque vous essayez de faire echo un caractère après lui. Le pagineur less montre ceci comme ^ M

Vous pouvez utiliser sed pour supprimer les “caractères de contrôle”, comme dans cet exemple:

 % test=$(curl -I "http://www.redirectURL.com/" 2>|/dev/null | awk '/^Location:/ { print $2 }' | sed -e 's/[[:cntrl:]]//') && echo "1..${test}..2" 1..http://www.redirecturl.com..2 

Notes :

J’ai utilisé awk plutôt que votre grep [...] | sed approche grep [...] | sed , sauver un processus.

Pour moi, curl renvoie l’emplacement dans une ligne commençant par ‘Location:’ (avec un ‘L’ majuscule), si votre version le signale en minuscule ‘l’, vous devrez peut-être modifier l’expression régulière en conséquence.

l’en-tête http “Location” commence par un L majuscule, essayez de le remplacer dans votre commande.

METTRE À JOUR

OK, j’ai exécuté les deux lignes séparément et chacune fonctionne correctement, sauf qu’il semble que la sortie de la commande curl inclut des caractères de contrôle capturés dans la variable. Lorsque ceci est imprimé plus tard dans la commande echo, la variable $ test est imprimée suivie d’un retour chariot pour placer le curseur au début de la ligne, puis ..2 est imprimé sur le dessus de 1.

Découvrez la variable $ test en moins:

 echo 1..$test..2 | less 

moins de spectacles:

 1..http://www.redirectURL.com/^M..2 

où ^ M est le caractère de retour chariot.