Boucle et espaces

Résolu/Fermé
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 14 sept. 2008 à 16:10
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 15 sept. 2008 à 19:49
Salut,

j'ai un blème qui a l'air classique avec une boucle while read line (bash) qui parcourt un fichier contenant des lignes comportant parfois des espaces.

Le fichier est dans cet esprit

$ cat Fichiers.txt
ccyamku.exe
quick start.exe
quickstart.exe
tyfvytfyt gnyug.exe


la boucle :

while read line
do (
echo "$line" > ReqFichier.txt
ReqFichier="$(cat ReqFichier.txt)"
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl"$ReqFichier"&ie=UTF-8" > Google.txt
...
)
done < Fichiers.txt


Après une multitude d'essais improductifs, le pb c'est que :
- si je mets des guillemets à $ReqFichier dans la dernière ligne, il coupe les mots avec espace en deux et curl se vautre
- sans les guillemets il ne réalise pas la boucle intégralement

Une idée svp ?

12 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 sept. 2008 à 17:15
Salut,

Déjà je ne vois pas l'utilité de créer un fichier avec le contenu de la ligne lu, puis de créer une variable initialisée avec le contenu unique du fichier !?

Pourquoi ne pas utiliser directement la variable "$line" ???
while read line
do (
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl"$line"&ie=UTF-8" > Google.txt
...
)
done < Fichiers.txt
Pour ton problème d'espace, essaye :
while read line
do (
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl"${line// /\\ }"&ie=UTF-8" > Google.txt
...
)
done < Fichiers.txt
;-))
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
14 sept. 2008 à 17:26
Salut, et merci

je suis d'accord avec ta remarque mais si j'ai procédé ainsi c'est parce que ça ne fonctionnait pas mieux avec $line directement

Sinon ça n'a pas l'air de marcher "${line// /\\ }" :

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12234    0 12234    0     0  24373      0 --:--:-- --:--:-- --:--:-- 68401

curl: (6) Couldn't resolve host 'gnyug.exe&ie=UTF-8'


on voit qu'il a encore coupé en deux la ligne "tyfvytfyt gnyug.exe" de Fichiers.txt
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 sept. 2008 à 17:31
Oups, enlève les guillemets autour de la variable :
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl${line// /\\ }&ie=UTF-8" > Google.txt
et ça devrait passer ;-))
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
14 sept. 2008 à 17:42
Ca ne marche toujours pas. D'après le fichier Google.txt, la réponse serait "Bad request", c'est peut être l'adresse qui est mal formée ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 sept. 2008 à 17:48
Re-oups ;-((
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl${line// /%20}&ie=UTF-8" > Google.txt
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
14 sept. 2008 à 19:03
Bon ça devrait marcher alors. L'autre truc c'est que dans cette boucle il y a une ligne suivante :

if grep -io 'did not match any documents' Google.txt ; then (echo "$line" >> VT.txt ; ComptVT=$(( $ComptVT + 1 )) ) ; fi


l'ennui c'est que rien n'est écrit dans VT.txt et donc ça foire. Si j'essaye directement :

curl -A "Mozilla/5.0" "https://www.google.com/search?q=gnyugytrdtr.exe&ie=UTF-8&gws_rd=ssl"


avec un nom sans espace donc, la réponse contient bien 'did not match any documents', en revanche avec un espace :

curl -A "Mozilla/5.0" "https://www.google.com/search?q=gnyugy&gws_rd=ssl trdtr.exe&ie=UTF-8"


=> Bad Request

donc en fait, il faut que je remplace les espaces à chaque fois par %20, c'est ce que je fais avant l'exécution de la boucle, ce qui donne untel fichier :

$cat Fichiers.txt
ccyamgku.exe
quick%20start.exe
quickstart.exe
tyfvytfyt%20gnyyug.exe


PS : j'ai modifié les deux noms bizaroïdes car ils sont déjà référencés sur google via ce topic, le but est qu'ils ne renvoient aucun résultat sur le moteur de recherche.

Et ça ne marche pas :

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12461    0 12461    0     0  24708      0 --:--:-- --:--:-- --:--:-- 68198
cat: VT.txt: Aucun fichier ou dossier de ce type


tu as une idée sur l'origine du problème ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
14 sept. 2008 à 19:20
Rajoute "set -xv" après la ligne "shebang" de ton script histoire de le rendre plus verbeux et de peut être voir ce qui foire, car là c'est pas évident de déboguer ton script sans avoir tous les paramètres en main ;-(
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
15 sept. 2008 à 10:03
Salut jipicy,

le script entier est le suivant :

cd ~/Documents/Scripts/REP/Modules

# on commence par isoler des chemins de fichiers du genre C:\windows\abc.exe, qu'on trie et dont on ne garde que le nom abc.exe, 

grep -io '[a-zA-Z]:\\.*\..*' HJTH.txt | sed 's/["/].*$//g' | sort | uniq -i  | awk -F'\' '{print $NF}' >> Fichiers.txt
ComptVT=0

# cette boucle est censée lancer une requête google par fichier. Si l'un d'entre eux ne renvoie aucun résultat ( 'did not match any documents'), alors il s'agit :
- d'incrémenter un compteur ComptVT à +1
- d'ajouter son nom à la suite du fichier VRT.txt (en allant à la ligne à chaque fois), qui contient déjà un texte quelconque ; si le compteur est supérieur à 1 il est inutile de copier dans le répertoire courant le fichier VRT.txt qui y est déjà.

while read line
do (
curl -A "Mozilla/5.0" "https://www.google.com/webhp?gws_rd=ssl${line// /%20}&ie=UTF-8" > Google.txt
if grep -io 'did not match any documents' Google.txt ; then (echo "$line" >> VT.txt ; ComptVT=$(( $ComptVT + 1 )) ) ; fi
if ! [ $ComptVT -gt 1 ] ; then (cp ~/Documents/Scripts/REP/REP_MH/Reponse/CND/VRT.txt ~/Documents/Scripts/REP/Modules ; echo -e "\n" >> VRT.txt ; cat VT.txt >> VRT.txt) ; fi
)
done < Fichiers.txt


est-ce qu'au niveau des explications c'est un peu plus clair ?
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
15 sept. 2008 à 16:33
Bon, je crois que je me suis embrouillé dans cette histoire. Un truc perturbant, c'est qu'en ayant posté ce sujet ici ça a référencé les noms des fichiers dont je voulais justement qu'ils ne renvoient aucun résultat sur google :)

Bref, la structure du script était quasi ok et surtout merci pour l'astuce de remplacement de chaîne "${line// /%20}" que je ne connaissais pas

A+
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
15 sept. 2008 à 16:41
De rien, mais si tu veux je peux supprimer le thread afin qu'il n'interfère plus dans tes tests et recherches...
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
15 sept. 2008 à 16:52
non ce n'est pas un souci, j'avais écrit ces noms complètement au hasard, ce ne seront jamais les mêmes par la suite.

J'en profite pour te poser encore une ou deux questions :

en shell bash, les imbrications de "while read line" / if / et encore if... ça ne pose pas des problèmes parfois ?

autre chose, j'ai cru remarquer que si un script sh en appelle un autre, que le premier a défini une variable, et que cette variable doit être utilisée par le deuxième script elle n'est pas (toujours ?) mémorisée... ça te parait exact ? si oui y a-t-il une manière autre que d'écrire cette variable dans un fichier et de la faire lire par le deuxième script ?

exemple tout bête :

Script1
...
var=$(grep -io 'coucou" fichier)
...
./Script2.sh


Script 2
...
if grep "$var2" fichier2 ; then echo coucou ; fi
...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
15 sept. 2008 à 16:57
Pas le temps de répondre maintenant, je te réponds ce soir...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
15 sept. 2008 à 19:01
en shell bash, les imbrications de "while read line" / if / et encore if... ça ne pose pas des problèmes parfois ?

Oui les imbrications de "read" posent problèmes lorsqu'ils sont employés avec les boucles "while/until" ou "for" ;-((

Les "if ... then .. elif ... then ... else ... fi" lorsqu'ils sont employés sans instructions read marchent bien en revanche.

autre chose, j'ai cru remarquer que si un script sh en appelle un autre, que le premier a défini une variable, et que cette variable doit être utilisée par le deuxième script elle n'est pas (toujours ?) mémorisée... ça te parait exact ?

Oui, c'est normal, il faut exporter ta variable pour quelle soit prise en compte.
var="blabla"
export var
./autre_script (ou "source autre_script")

si oui y a-t-il une manière autre que d'écrire cette variable dans un fichier et de la faire lire par le deuxième script ?

Voir ci-dessus ;-))
0
eZula Messages postés 3392 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
15 sept. 2008 à 19:49
Ok, merci bien pour ces précisions

A très vite sans doute :))
0