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 :

Unix et Sed: récupérer une partie d'une chaine


Sujet :

Linux

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut Unix et Sed: récupérer une partie d'une chaine
    Bonjour,

    J'ai la chaîne suivante: "truc={bidule} machin={blabla.9399}"
    Si je lance la commande suivante :

    echo "truc={bidule} machin={blabla.9399}" | sed "s/truc={\(.*\)}.*/\1/"

    J'obtiens le résultat suivant :

    bidule} machin={blabla.9399

    En gros il cherche le plus long pattern répondant à la requête... Est-il possible de lui dire de s'arrêter au premier pattern rencontré? En gros il faudrait que cela me donne juste "bidule".

    Merci par avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Il faut un espace entre } et .*

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "truc={bidule} machin={blabla.9399}" | sed -e "s/truc={\(.*\)} .*/\1/"
    bidule

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut
    Merci pour ta réponse Mygale1978. J'ai un petit problème cependant en essayant ta proposition :

    echo "truc={bidule} chouette={hiboux} machin={blabla.9399} " | sed -e "s/chouette={\(.*\)} .*/\1/"

    donne :

    truc={bidule} hiboux} machin={blabla.9399

    Je ne comprends plus rien... Quelqu'un peut-il m'aider ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui

    car tu as un deuxième espace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [sshuser@be-prod Test-Simple-0.80]$ echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | sed -e "s/truc={\(.*\)} .* .*/\1/g"
    bidule

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut
    Le problème, c'est que je ne connais pas à l'avance le nombre de clef/valeur. Je ne peux donc pas ajouter de [espace].* de manière dynamique...

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par falcon Voir le message
    Le problème, c'est que je ne connais pas à l'avance le nombre de clef/valeur. Je ne peux donc pas ajouter de [espace].* de manière dynamique...
    Ben faut passer par un outil plus puissant style awk.

    Bon, je tape ça vite fait car je peux pas tester mais ça me semble pas mal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "truc={bidule} machin={blabla.9399}" | awk -vkey=truc '{for (i=1; i <= NF; i++) if (strncmp($i, key, strlen(key)) == 0) print $i}'
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    2 solutions possibles avec sed ou awk (+ élégant)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | \
    sed -e 's/^[^{]*{//' -e 's/}.*$//'
     
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | \
    awk -F"[{}]" '{print $2}'

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BlaireauOne Voir le message
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | \
    awk -F"[{}]" '{print $2}'[/CODE]
    C'est vrai que toi t'es une super brute du awk ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Par défaut
    Et directement en shell ça marche pas ?
    (attention, ceci fonctionne avec ksh ou bash ou autre plus évolués mais je n'ai pas testé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -bash-3.1$ toto="truc={bidule} machin={blabla.9399} coucou={tetscoucuo}"
    -bash-3.1$ echo $toto
    truc={bidule} machin={blabla.9399} coucou={tetscoucuo}
    -bash-3.1$ toto=${toto#*{}
    -bash-3.1$ echo ${toto}
    bidule} machin={blabla.9399} coucou={tetscoucuo}
    -bash-3.1$ toto=${toto%%\}*}
    -bash-3.1$ echo ${toto}
    bidule
    En résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto="truc={bidule} machin={blabla.9399} coucou={tetscoucuo}"
    toto=${toto#*{}
    toto=${toto%%\}*}
    Ca a le mérite de ne pas appeler de programme externe
    Mais je trouve la solution de BlaireauOne avec awk plutôt élégante !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Bonjour,

    le problème est qu'il ne connaît pas le nombre d'espace, donc si j'ai bien compris, la solution AWK de BlaireauOne peut ne pas convenir car il faudrait connaître la position de la "clef/valeur" qu'on veut afficher

    Sinon encore un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    clef=truc
     
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" |\
    sed -e "s/} /\n/g" | grep $clef | cut -f2 -d"{"
    Je transforme le fichier pour n'avoir qu'un couple clef/valeur par ligne, et je traite avec grep et cut.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par To-Ma Voir le message
    Bonjour,

    le problème est qu'il ne connaît pas le nombre d'espace, donc si j'ai bien compris, la solution AWK de BlaireauOne peut ne pas convenir car il faudrait connaître la position de la "clef/valeur" qu'on veut afficher
    Ben on sait pas où est la clef mais on la connait !!! Dans son exemple il cherche la clef "truc" donc il suffit de balayer les couples (et comme il y a un espace entre chaque couple awk considère chaque couple comme une chaine) et chercher la chaine qui commence par la clef demandée...

    Mais effectivement ma soluce a l'inconvénient d'être sensible aux espaces (style "truc={ma valeur}") alors que la soluce de BlaireauOne demande à awk de découper sur les accolades....

    Citation Envoyé par To-Ma Voir le message
    Je transforme le fichier pour n'avoir qu'un couple clef/valeur par ligne, et je traite avec grep et cut.
    Ouaip. J'avais aussi envisagé cette soluce puis je m'étais dit qu'on pouvait le faire en awk. Ben finalement ptet que c'est ce qu'il y a de mieux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre émérite Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Par défaut
    Rappel.
    La demande d'origine est la suivante :

    En gros il cherche le plus long pattern répondant à la requête... Est-il possible de lui dire de s'arrêter au premier pattern rencontré? En gros il faudrait que cela me donne juste "bidule".

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Citation Envoyé par BlaireauOne Voir le message
    Rappel.
    La demande d'origine est la suivante : [...]
    C'est vrai, mais la suite de la discussion semble préciser cette demande pour un affichage de valeur correspondant à une clef spécifique, quelque soit la place dans le fichier, d'où ma suggestion.

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par To-Ma Voir le message
    C'est vrai, mais la suite de la discussion semble préciser cette demande pour un affichage de valeur correspondant à une clef spécifique, quelque soit la place dans le fichier, d'où ma suggestion.
    Boaf de toute façon Falcon ne dit plus rien alors...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut
    Bonjour,

    Merci pour tous vos échanges. Je vais étudier les solutions proposées. Pour clarifier la situation, j'ai une liste d'arguments composée de clef/valeur.
    Je cherche un moyen de retrouver la valeur de n'importe quelle clef. Je ne peux donc pas me fier sur la position des clefs (elles peuvent être dans n'importe quel ordre) ni sur le nombre d'arguments (il peut y en avoir 1, 2, 3 ou plusieurs).

    bidule={machin} truc={chouette} chouette={hiboux}

    Si je donne la clef "chouette", on doit me renvoyer la valeur hiboux, si je donne la clef "bidule" il doit me renvoyer la valeur "machin".

    J'ai commencé sur les expressions régulières pour répondre à ce problème, mais il y a peut être plus simple...

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut
    Salut,

    Merci pour ta réponse. Je dois récupérer la valeur non pas par rapport à sa position mais par rapport à la clef.

    @+

    Citation Envoyé par BlaireauOne Voir le message
    2 solutions possibles avec sed ou awk (+ élégant)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | \
    sed -e 's/^[^{]*{//' -e 's/}.*$//'
     
    echo "truc={bidule} machin={blabla.9399} coucou={tetscoucuo}" | \
    awk -F"[{}]" '{print $2}'

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 109
    Par défaut
    Finalement j'ai fait comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo "truc={bidule} machin={blabla.9399}" | awk -vkey=machin '{for (i=1; i <= NF; i++) if (substr($i, 0, length(key)) == key)   print $i }' | sed "s/.*{\(.*\).*}/\1/"
    A priori je n'ai pas la dernière version de 'awk' ou 'sed' qui me permettrait de faire plus simplement.

    Merci à tous pour votre aide.

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

Discussions similaires

  1. [Débutant] Récupérer les coordonnées d'une partie d'une figure
    Par LeTube dans le forum MATLAB
    Réponses: 0
    Dernier message: 04/06/2014, 14h41
  2. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 15h23
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 12h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 17h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 14h39

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