Remplacement %20 d'url en espaces avec sed

Résolu
frederikk Messages postés 15 Date d'inscription   Statut Membre -  
frederikk Messages postés 15 Date d'inscription   Statut Membre -
Bonjour,

voilà j'ai des url où les espaces sont remplacés par des %20. Jusque là, un petit sed me permet de facilement remettre des espaces. Mais j'ai un souci lorsqu'il y a deux voire plus de %20 .

En effet, si je fais

- echo "champ1=g%20%20C&champ2=P" | sed 's/%20/ /g'

ca fonctionne : champ1=g C&champ2=P ( 2 espaces entre g et C )

Par contre si je mets ceci dans un script, alors les deux espaces deviennent 1 seul espace !!! Je comprends pas... si quelqu'un a une idée... j'ai essayé les " mais il me les affiche, les [], les {}.. bref quasiment tous les caractères spéciaux... :(

Ciao
Fred
Configuration: Linux
shell ( ash venant d'une busybox

8 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Affiche ton script, sans quoi on ne pourra t'aider ;-)
    0
    1. frederikk Messages postés 15 Date d'inscription   Statut Membre
       
      Ben mon script c'est juste ca.... :)
      avec un #!/bin/sh devant...

      Je veux juste cela... j'ai beau essayer il me sort touours 1 seul espace.. alors que si je remplace %20 par des _ par exemple, j'ai bien deux _ à l'arrivée.

      Ciao
      Fred
      0
  2. frederikk Messages postés 15 Date d'inscription   Statut Membre
     
    Voici le script avec mon essai vers les _ avant... pour me montrer que ca fonctionne bien.

    #!/bin/sh
    #
    QUERY_STRING=`cat url2 | grep champ1`

    ST1=`echo $QUERY_STRING | sed -e 's/%20/_/g`
    ST2=`echo $ST1 | sed -e 's/_/ /g`
    N1=`echo $ST1 | sed 's/\&$//'`
    N2=`echo $QUERY_STRING | sed -e 's/%20/ /g' | awk -F'champ[12]=' '{print $3}'`

    echo $QUERY_STRING ; echo $ST1 ; echo $ST2 ; echo $N1 ; echo $N2 ; exit

    Voici le résultat :
    /tmp # ./test.sh
    champ1=g%20%20C&champ2=PL5
    champ1=g__C&champ2=PL5
    champ1=g C&champ2=PL5
    champ1=g__C&champ2=PL5
    PL5
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Il manque les quotes simples fermantes sur tes variables "ST1" et "ST2" ;-\
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Affiche-le quand même...

    Rajoute "set -xv" après le "shebang" et affiche le résultat de l'exécution de ton script s'il te plaît, merci.
    0
  4. frederikk Messages postés 15 Date d'inscription   Statut Membre
     
    Rebonsoir,
    voici le lancement du script en debug.

    /tmp # sh -xv ./test.sh
    #!/bin/sh
    #
    QUERY_STRING=`cat url2 | grep champ1`
    + cat url2
    + grep champ1
    + QUERY_STRING=champ1=g%20%20C&champ2=PL5

    ST1=`echo $QUERY_STRING | sed -e 's/%20/_/g`
    + echo champ1=g%20%20C&champ2=PL5
    + sed -e s/%20/_/g
    + ST1=champ1=g__C&champ2=PL5
    ST2=`echo $ST1 | sed -e 's/_/ /g`
    + echo champ1=g__C&champ2=PL5
    + sed -e s/_/ /g
    + ST2=champ1=g C&champ2=PL5
    N1=`echo $ST1 | sed 's/\&$//'`
    + echo champ1=g__C&champ2=PL5
    + sed s/\&$//
    + N1=champ1=g__C&champ2=PL5
    N2=`echo $QUERY_STRING | sed -e 's/%20/ /g' | awk -F'champ[12]=' '{print $3}'`
    + sed -e s/%20/ /g
    + awk -Fchamp[12]= {print $3}
    + echo champ1=g%20%20C&champ2=PL5
    + N2=PL5

    echo $QUERY_STRING ; echo $ST1 ; echo $ST2 ; echo $N1 ; echo $N2 ; exit
    + echo champ1=g%20%20C&champ2=PL5
    champ1=g%20%20C&champ2=PL5
    + echo champ1=g__C&champ2=PL5
    champ1=g__C&champ2=PL5
    + echo champ1=g C&champ2=PL5
    champ1=g C&champ2=PL5
    + echo champ1=g__C&champ2=PL5
    champ1=g__C&champ2=PL5
    + echo PL5
    PL5
    + exit

    Honnêtement... je comprends vraiment pas pourquoi cette reaction !!!
    Pour info, même boite, meme shell, et si je lance à la main la commande sed, le resultat a bien 2 espaces à l'arrivée !!!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Il manque les quotes simples fermantes sur tes variables "ST1" et "ST2" ;-\
    comme qui c'est bien d'utiliser $() au lieu des apostrophes simples

    voici un exemple
    lami20j@debian:~$ cat url.sh
    #!/bin/sh
    #
    QUERY_STRING="champ1=g%20%20C&champ2=P"
    
    ST1=$(echo $QUERY_STRING | sed  -e 's/\%20/_/g')
    ST2=$(echo $ST1 | sed -e 's/_/ /g')
    N1=$(echo $ST1 | sed 's/\&$//')
    N2=$(echo $QUERY_STRING | sed -e 's/%20/ /g' | awk -F'champ[12]=' '{print $3}')
    
    echo $QUERY_STRING ; echo $ST1 ; echo $ST2 ; echo $N1 ; echo $N2 ; exit
    lami20j@debian:~$ sh url.sh
    champ1=g%20%20C&champ2=P
    champ1=g__C&champ2=P
    champ1=g C&champ2=P
    champ1=g__C&champ2=P
    P
    lami20j@debian:~$
    
    tu n'as qu'à modifier QUERY_STRING pour tester
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Il faut quoter tes variables :
    #!/bin/sh
    #
    QUERY_STRING=`cat url2 | grep champ1`
    
    ST1=`echo "$QUERY_STRING" | sed -e 's/%20/_/g`
    ST2=`echo "$ST1" | sed -e 's/_/ /g`
    N1=`echo "$ST1" | sed 's/\&$//'`
    N2=`echo "$QUERY_STRING" | sed -e 's/%20/ /g' | awk -F'champ[12]=' '{print $3}'`
    
    echo "$QUERY_STRING" ; echo "$ST1" ; echo "$ST2" ; echo "$N1" ; echo "$N2" ; exit 
    ;-))
    0
  8. frederikk Messages postés 15 Date d'inscription   Statut Membre
     
    Merci messieurs !!!

    Bon alors concernant les `fermant le sed.. effectivemment ca vient du fait que j'ai fait tellement de changements/ tests... elles sont passées à la trappe..

    Mais c'est effectivemment les "" sur les echo qui manquaient. Merci jipicy.
    Apparemment c'est ok dans mon script original, beaucoup plus long mais reprenant ce que je vous ai mis.

    Ciao
    Fred
    0
  9. frederikk Messages postés 15 Date d'inscription   Statut Membre
     
    Bon alors.... c'est assez étrange comme truc.. mais j'ai un second script, qui doit faire la même chose, et pareil !!!! il me transforme les doubles espaces en simple !!! je comprends plus !!!

    voici le code :

    STO1=`echo "$QUERY_STRING" | awk -F'&champ[1234]=' '{print $1}'`
    ST1=`echo "$STO1" | awk -F'=' '{print $2}'`
    ST2=`echo "$QUERY_STRING" | awk -F'&champ[1234]=' '{print $2}'`
    ST3=`echo "$QUERY_STRING" | awk -F'&champ[1234]=' '{print $3}'`
    ST4=`echo "$QUERY_STRING" | awk -F'&champ[1234]=' '{print $4}'`

    # TRAVAIL SUR LES CHAMPS
    N1=`echo "$ST1" | sed -e 's/%20/ /g'`
    N2=`echo "$ST2" | sed -e 's/%20/ /g'`
    N3=`echo "$ST3" | sed -e 's/%20/ /g'`

    # Section de travail sur le fichier à ajouter
    FICHIER=`echo "/tmp/${N1}/${N2}/${N3}"`

    echo "ST3 = $ST3<br>"
    echo "$N3"
    exit

    Et pareil.... si j'ai deux espaces, ca devient un seul ! pourtant j'ai bien "double-quoté"
    0