IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Stocker le contenu d'un fichier texte dans un tableau


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut Stocker le contenu d'un fichier texte dans un tableau
    Bonsoir,

    Pourriez-vous m'aider à résoudre le problème suivant ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #!/bin/bash
     
    # Récupération / mise en forme de l'url du fichier à télécharger :
    urld[1]=`cat "/user/url.lst" | grep ^url1 | sed s/url1=// `
     
    # Affiche l'url pour vérifier le stockage correct dans le tableau (OK):
    echo i= 1 :  ${urld[1]}
     
    # Télécharge la page web (NOK).
    wget ${urld[1]}

    contenu de /user/url.lst
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    url1=<a href="http://www.monsite1.com.index.php%od/" target="_blank">www.monsite1.com.index.php</a>
    Bien que la page à télécharger soit correctement stockée dans le tableau, le téléchargement ne marche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    http:// <a href="http://www.monsite1.com.index.php%od/" target="_blank">www.monsite1.com.index.php%OD</a>
    => index.php%0D
    Bad Request
    Il semble que ce %OD apparaisse au moment ou je lis et stocke le contenu du fichier externe.
    Pouvez-vous m'expliquer ce qui se passe, et me dire comment supprimer ce %OD ?

    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    je crois que c'est à cause des caractères de retour qui sont pris quand tu récupères ton url de url.lst. tu dois avoir des caractères de retour microsoft et non des caractères unix.
    télécharges dos2unix et faiset relances ton script. comment tu génères ce fichier url.lst ?

    bref pour supprimer cela, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wget $(sed 's/%OD//' ${urld[1]})
    c'est pas beau mais ça devrait marcher.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Michaël
    je crois que c'est à cause des caractères de retour qui sont pris quand tu récupères ton url de url.lst. tu dois avoir des
    aractères de retour microsoft et non des caractères unix.
    télécharges dos2unix et fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os2unix /user/url.lst
    et relances ton script. comment tu génères ce fichier url.lst ?
    Bien vu ! Le fichier usr.lst est généré sur une machine Window, à partir de "notepad++",
    le pb vient de là. Je viens d'essayer avec un "usr.lst" créé sous Linux, tout fonctionne parfaitement. En revanche, la moulinette dos2unix ne corrige pas le pb du fichier sous Windows.

    De plus, bizarrement, après quelques modifications dans mon fichier usr.lst, je me retrouve plusieurs %OD concaténés en fin de ligne au lieu d'un seul ...

    Citation Envoyé par Michaël
    bref pour supprimer cela, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wget $(sed 's/%OD//' ${urld[1]})
    c'est pas beau mais ça devrait marcher.
    Cette syntaxe ne marche pas, la console retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    aucun fichier ou répertoire de ce typete.fr/index.php
    wget url manquant
    Peut-on filtrer dès l'enregistrement dans le tableau ? J'ai essayé cette syntaxe mais elle ne marche pas. Ai-je loupé quelque chose ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    urld[1]=`cat "/user/url.lst" | grep ^url1 | sed s/url1=// | sed s/%0D//g `
    Help

  4. #4
    Membre actif
    Avatar de vosaray
    Profil pro
    Architecte technique
    Inscrit en
    Mai 2004
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 217
    Points : 299
    Points
    299
    Par défaut
    Pour pruner les retour chariots windozines tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi.save -e 's/\r//g' /user/url.lst

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par vosaray
    Pour pruner les retour chariots windozines tu peux essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -pi.save -e 's/\r//g' /user/url.lst
    Merci, mais pour ce projet, je n'ai pas la possibilité d'utiliser PERL.
    Je dois trouver une solution via le script bash.

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    la solution de Michaël devrait marcher, à ceci près que c'est wget qui transforme le \r en %0D, donc ce n'est pas %0D qu'il faut supprimer, mais \r.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urld[1]=`cat "/user/url.lst" | grep ^url1 | sed s/url1=// | sed s/\r$//g
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Celelibi
    la solution de Michaël devrait marcher, à ceci près que c'est wget qui transforme le \r en %0D, donc ce n'est pas %0D qu'il faut supprimer, mais \r.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urld[1]=`cat "/user/url.lst" | grep ^url1 | sed s/url1=// | sed s/\r$//g
    Cette solution correspond exactement à ce que je veux, malheureusement, "sed" ne filtre pas le retour chariot.
    Voici le script que je viens de lancer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    urld[1]=`cat "/EPG/user.lst" | grep ^url1 | sed s/url1=// | sed s/\r$//g `
    wget  ${urld[1]}
    et le msg d'erreur (saut de ligne toujours présent):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    --22:18:23--  <a href="http://monsiteweb.free.fr/index.php%0D" target="_blank">http://monsiteweb.free.fr/index.php%0D</a>
               => `index.php%0D'
    Résolution de monsiteweb.free.fr... échec: Nom ou service inconnu.
    [root@PCTEST plugins]#
    Le retour chariot "windozien" pourrait-il être codé autrement ?

  8. #8
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Les retours de chariot sont codés comme suit selon les OS :
    Unix-like : \n -> 0x0A
    anciens MAC : \r -> 0x0D
    Windows (et nouveaux macs) : \r\n -> 0x0D 0x0A

    Ces nobres hexadécimaux tu devrais les voirs si tu regarde ton fichier avec un éditeur hexadécimal comme hexedit ou hexdump (ce dernier fait juste un dump).


    Sinon, si le sed marche pas c'est uniquement parce qu'il faut mettre des guillemets autour de l'expression pour empêcher l'interprêtation du \r par le shell.

    Petit exemple avec un echo à la place du cat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo -n "url1=blabla\r\nurl1=foobar\r\n" | grep ^url1 | sed s/url1=// | sed s/\r$//g | hexdump -C
    00000000  62 6c 61 62 6c 61 0d 0a  66 6f 6f 62 61 72 0d 0a  |blabla..foobar..|
    00000010
     
    $ echo -n "url1=blabla\r\nurl1=foobar\r\n" | grep ^url1 | sed s/url1=// | sed 's/\r$//g' | hexdump -C
    00000000  62 6c 61 62 6c 61 0a 66  6f 6f 62 61 72 0a        |blabla.foobar.|
    0000000e
    Si tu ne veux pas des guillemets tu peux simplement doubler l'anti-slash : sed s/\\r$//



    PS : tiens d'ailleurs je sais pas pourquoi j'ai mis le flag g un peu partout alors que c'est inutile.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 80
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par Celelibi
    Les retours de chariot sont codés comme suit selon les OS :
    Unix-like : \n -> 0x0A
    anciens MAC : \r -> 0x0D
    Windows (et nouveaux macs) : \r\n -> 0x0D 0x0A

    Ces nobres hexadécimaux tu devrais les voirs si tu regarde ton fichier avec un éditeur hexadécimal comme hexedit ou hexdump (ce dernier fait juste un dump)
    ...
    OK. J'ai visualisé le contenu du fichier lst avec un éditeur héxa. Je retrouve bien autant de "0D" que de sauts de ligne. En revanche, aucune trace de "0A" (lié au format de sauvegarde de notepad++ Windows ?).

    Citation Envoyé par Celelibi
    ...
    Sinon, si le sed marche pas c'est uniquement parce qu'il faut mettre des guillemets autour de l'expression pour empêcher l'interprêtation du \r par le shell.
    ...
    Si tu ne veux pas des guillemets tu peux simplement doubler l'anti-slash : sed s/\\r$//
    J'ai essayé les deux options : les doubles quotes fonctionnent, mais pas l'anti-slash supplémentaire. La syntaxe que j'ai appliquée est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    urld[1]=`cat "$path$file" | grep ^url1 | sed s/url1=// | sed s/"\r$"//g `
    wget  ${urld[1]}
    Merci à tous pour votre support !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. stocker le contenu d'un fichier texte dans un tableau
    Par sneb5757 dans le forum Débuter
    Réponses: 12
    Dernier message: 24/10/2008, 21h11
  2. contenu d'un fichier texte dans un tableau
    Par lyoram dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 30/11/2006, 11h15
  3. Réponses: 4
    Dernier message: 15/08/2006, 17h40
  4. Réponses: 3
    Dernier message: 19/05/2006, 11h35
  5. [Tableaux] Stocker un fichier texte dans un tableau
    Par clairette59 dans le forum Langage
    Réponses: 13
    Dernier message: 27/01/2006, 23h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo