Forum Programmation.shell problème commande sed/tr

Posté par  .
Étiquettes : aucune
0
21
nov.
2005
Bonjour ,

J'ai un ptit problème avec le remplacement d'une chaine de caractère.

Je fois modifier une chaine de caractère afin de remplacer les occurences '\2xF' par '/' .
J'ai voulu utiliser pour ça la commande 'sed' , en tapant :

sed 's/\2xF///g'


mais ça ne fonctionne pas ... j'avais déjà vu la commande sed avec un séparateur ',' donc j'ai testé aussi , mais sans succés.

Desespéré , j'ai essayé de passé par la commande tr
en tapant :

tr '\2xF' '/'


mais les resultats sont pas vraiment ceux que j'attendait (en gros à chaque fois qu'il voit un 2 il commence à faire n'importe koi).

est-ce que quelqu'un aurait une ptite solution à me proposer?
Je suppose que le problème vient du fait que je remplace par un caractère spéciaux , mais je vois pas comment résoudre le soucis.

Merci d'avance.
Dart
  • # sed 's;\\2xF;/;g'

    Posté par  . Évalué à 1.

    Ca a l'air de marcher ; je viens de tester.
    • [^] # Re: sed 's;\\2xF;/;g'

      Posté par  . Évalué à 1.

      Merci beaucoup pour la réponse!
      Effectivement , ça fonctionne correctement ... en shell.


      Malheuresement , vu l'utilisation que je souhaite en faire (utilisation dans un script CGI) , ça ne fonctionne pas.

      je developpe un peu plus (au cas ou une bonne ame voudrait se pencher sur le sujet ^^):

      dans un script CGI je dois entrer dans un formulaire (méthode : post) une adresse IP suivit d'un '/' et un masque de sous-reseaux (ex : 192.168.0.1/255.255.0.0 )

      Lorsque je traite le formulaire et que j'affiche l'information brut reçu j'obtiens un truc du genre 192.168.0.1\2xF255.255.0.0 (me demandez pas trop pourkoi , apparemment une norme du standard html v_v)
      Je voulais donc utiliser la commande en question pour remplacer le vilain '\2xF' par un beau '/' ...

      Problème principal : ça ne fonctionne pas ^o^
      j'ai essayé d'afficher le resultat final (sans succés , il ne m'affiche rien du tout) mais aussi de le redireger vers un fichier pour voir si il écrivait convenablement dans le fichier ... et je dois dire que rien ne fonctionne....

      Quelqu'un à une idée sur la marche à suivre ?
      • [^] # Re: sed 's;\\2xF;/;g'

        Posté par  . Évalué à 3.

        Le problème vient très probablement du backslash '\'.
        Je procèderais par étapes :
        1- Valider la méthode de substitution avec une autre pattern simplissime. Par exemple tu saisis dans ton formulaire 192.168.0.1toto255.255.0.0 et dans ton CGI tu fais du sed 's;toto;/;g'. Si ça marche, c'est un bon début.
        2- Ensuite, faire plusieurs essais en doublant le nombre de '\' à chaque fois :
        sed 's;\\2xF;/;g'
        sed 's;\\\\2xF;/;g'
        ...
        3- Enfin, si tu ne t'en sors pas comme ça, tu fais deux champs (IP + masque) au lieu d'un seul (IP/masque).
        • [^] # Re: sed 's;\\2xF;/;g'

          Posté par  (site web personnel) . Évalué à 3.

          Une autre maniere de t'assurer que tu as bien protege tous les caracteres d'echappement qui doivent se retrouver dnas ta commande sed a la fin, c'est de semplacer sed par echo le temps de tester. Si la commande a une bonne tete, alors il sera temps de passer a sed.
          En partitulier, il te faut savoir qui echappe quoi. Si tu constriot la requete pour sed dans une chaind de ton cgi. les " " de ton cgi premettent interpretent surement \ comme un caracter d'echappement, il faut dont le proteger par \\. maintenant, sed lui aussi interprete \ de maniere spéciale, font pour faire ne sorte que set ecrive \, il te faudea metter \\\\ dans le cgi

          Euh, bon, c'est pas tres clair, mais par contre utiliser echo devrait deja t'aider un peu
  • # Merci beaucoup

    Posté par  . Évalué à 1.

    Merci beaucoup pour votre aide (en particulier pour la méthode de résolution du problème ;-) ) .

    Je n'ai malheuresement pas réussi à résoudre le soucis (le sed fonctionne sur le script CGI , mais l'utilisation du charactère '\' dans le '\2xF' reste problématique).

    J'ai testé de rajouter plusieurs '\' afin d'éviter l'interprétation de sed (et du cgi apparemment) , j'ai fait quelques test avec un echo ... malheuresement ça ne donne rien.

    Je vais trouver une autre solution pour résoudre le problème dans mon application (histoire de pas rester bloquer sur un détail).

    Merci encore de vous être penché sur le problème
    • [^] # Re: Merci beaucoup

      Posté par  . Évalué à 4.

      J'ai testé dans un script cgi et chez moi ça marche:

      echo "<b>55.55.55.55\2xF255.255.255.0</b>" | sed "s~\\\2xF~/~g"

      J'ai bien ça comme retour dans la source de la page.

      <b>55.55.55.55/255.255.255.0</b>

      Peut etre recupere tu les infos par la variable

      QUERY_STRING

      Peut tu nous en montré plus...?
      Si tu fais echo $QUERY_STRING tu a quoi comme retour...?
      • [^] # Ptet un élèment de réponse

        Posté par  . Évalué à 1.

        Tout d'abord merci beaucoup d'avoir passé du temps sur mon ptit problème.

        Effectivement , tout ça me semblait étrange, car j'avais déjà testé un truc similaire à la première commande (faire un simple echo du code html) et effectivement ça fonctionnait.

        Mais je pense que l'affichage de la variable Query_String donne un élement de réponse (je débute en CGI et je ne connaissait pas cette variable).

        donc voila ce que m'affiche 'echo $QUERY_STRING' lorsque j'entre 192/25 dans mon formulaire:
        textfield=192%2F25&Submit=Entrer

        Apparemment HTML ne code pas le caractère '/' en '\2xF' , mais plutot en '%2F' ce qui fait que je ne comprends strictement pas pourkoi il y a un autre encodage (en gros pourkoi ma page CGI de traitement de formulaire n'affiche pas %2F mais bien \2xF) .... mais passons.

        Force est de constater que le traitement de la chaine était erroné car je voulais interchanger le mauvais jeu de caractère.
        Je suppose qu'ici je dois donc transformer la chaine '%2F' en '/' .
        Mais malheuresement la commande sed : ' sed "s,%2F,/,g" ' ne marche pas.
        (j'ai essayé de rajouter des '\' avant le caractère % , mais rien n'y fait v_v)

        Une idée d'ou vient le problème ???
        Merci d'avance.
        • [^] # Re: Ptet un élèment de réponse

          Posté par  . Évalué à 2.

          echo "deck%2Fdeck" | sed 's~%2F~/~g'

          me retourne bien

          deck/deck
          en cgi, quand à %2F, c'est normal, si il laissait le slash
          dans l'URL, je te laisse imaginer le drame...!!

          textfield=192%2F25&Submit=Entrer

          Pour il y a Submit=Entrer dans $QUERY_STRING...?

          C'est voulu ou pas...?
          • [^] # Re: Ptet un élèment de réponse

            Posté par  . Évalué à 1.

            Bon , après pas mal de test en tout genre , la solution proposé fonctionne correctement.

            L'erreur venait tout simplement du programmeur (i.e : Moi ^o^).
            Merci beaucoup pour l'aide en tout cas....

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.