Forum Programmation.shell Extraction de chaînes de caractères

Posté par  .
Étiquettes : aucune
0
17
fév.
2006
Bonjour,

Je développe un shell script qui récupère le résultat d'un formulaire web. Je voudrais ensuite extraire les valeurs saisies dans ce formulaire.

La chaîne de caractères reçue est de cette forme :
NomClient=blabla&Client1Menu1=toto&Client1Menu2=tata&Client1Menu3=tutu&Client2Menu1=&Client2Menu2=&Client3Menu1=&Client3Menu2=&Client4Menu1=

Selon le cas, les champs ClientxMenux sont renseignés ou non. Il faudrait que je récupère les valeurs de ces champs s'ils sont renseignés. De plus, le nombre de champs renseignés peut changer.

Avec awk 'BEGIN{FS="&"}{print $2 $3 $4}', je récupère bien les couples champs/valeurs qui sont renseignés ici (Client1Menu1=toto Client1Menu2=tata Client1Menu3=tutu). Mais si les champs renseignés sont Client3Menu1 et Client3Menu2, ça ne fonctionne pas.

C'est possible de faire ça avec awk ?
  • # oui

    Posté par  . Évalué à 3.

    oui, c'est possible.

    au lieu de considérer & comme un carcatère de séparation de champ (FS) tu le considères comme une fin de ligne (RS)
    Puis tu filtre les champs non nul (qui ne se termine pas par =)

    donc
    awk 'BEGIN{RS="&"} !/=$/{ print }'

    voilà :)
    • [^] # Re: oui

      Posté par  . Évalué à 2.

      Super. Merci de ta réponse.

      Visiblement, la commande que tu donnes pour filtrer les champs non nuls ne fonctionne pas avec la version de awk que j'utilise (MacOS X Server). Ca fonctionne bien sous Ubuntu.
      Mais effectivement, en utilisant ta méthode pour séparer les champs, j'obtiens le résultat escompté avec :

      awk 'BEGIN { RS="&" ; FS="=" } { if ($2 != "") { print $2 } }'

      Enfin, il reste que je ne comprends pas bien la commande que tu utilises pour filtrer les champs non nuls : !/=$/{ print }
      :)
      • [^] # Re: oui

        Posté par  . Évalué à 3.

        j'explique :)

        un champ qui n'est pas rempli se termine par un égal
        donc le motif de recherche (encadré par deux / ) pour rechercher les champs non rempli est =$ (ou $ définit une fin de ligne. ici la fin de ligne est redéfini par le caractère &)

        Mais toi ce qui t'intéresse, c'est les champs remplis. Donc la négation de /=$/ est !/=$/ (! signifie le contraire).

        donc si !/=$/ alors on affiche { print }

        simple non ? :)

Suivre le flux des commentaires

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