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

Shell et commandes GNU Discussion :

[SH] Extraction sous-chaine (encore ;-) )


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut [SH] Extraction sous-chaine (encore ;-) )
    Bonjour,

    Je n'arrive pas extraire une sous-chaîne en une seule commande.
    Mais avant de me résigner a le faire en plusieurs étape, je vous expose mon pb au cas ou ...


    alors dans ma variable j'ai la chaîne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto="CREATE TABLE MA_TABLE ("
    je voudrais extraire juste la chaîne "MA_TABLE"
    Or le mot "Table" peut être écrit en majuscule minuscule ....
    la "(" peut être collé ou non a ma chaîne
    et évidement il peut y avoir des retours à la ligne entre les mots.

    un truc simple en somme ;-)

    bon si vous avec une solution en "3" lignes je prend aussi


    Merci

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alx13 Voir le message
    je voudrais extraire juste la chaîne "MA_TABLE"
    Or le mot "Table" peut être écrit en majuscule minuscule ....
    la "(" peut être collé ou non a ma chaîne
    Salut

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    nomTable=`echo "$toto" |cut -f3 -d' ' |sed -e "s/(//"`


    Citation Envoyé par alx13 Voir le message
    et évidement il peut y avoir des retours à la ligne entre les mots.
    Là ça devient un poil plus compliqué. Et en plus suis pas chez-moi donc je peux pas tester mais laisse moi qq minutes et je reviendrai donner une solution
    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]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    là, parce que c'est du sh, je verrais bien un coup d'expr "$var" match "motif".

    regarde le page d'info

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Bon désolé pour les "qq minutes", j'ai complètement zappé une fois rentré chez-moi.

    Sinon ben en fait la solution est toute simple même si c'est sur plusieurs lignes:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    nomTable=`echo $toto |cut -f3 -d' ' |sed -e "s/(//"`
    La différence tient aux guillemets autour de $toto. Avec les guillemets le caractère "eol" est pris en compte et donc le cut voit arriver 3 lignes, mais sans eux, il n'est pas pris en compte et le cut voit arriver les 3 lignes jointes en une seule...

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    là, parce que c'est du sh, je verrais bien un coup d'expr "$var" match "motif".
    Hey
    expr étant une commande externe, ça pourra s'utiliser que ce soit du sh, du csh, du ksh non ???
    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]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    Salut,

    Tout d'abord merci à N_BaH et Sve@r pour vos réponses

    La solution du couple cut/sed marche bien quand la chaine est sur une seule ligne.
    Comme quoi les solutions les plus simples sont souvent les meilleurs

    Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.

    Je vais quand même faire le test dans le script histoire d'être sur.
    Et je vous tiens au courant.

    Merci encore.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Citation Envoyé par alx13 Voir le message
    Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.
    Sve@r te l'as pourtant expliqué dans son message précédent, c'est une histoire de guillemets autour de la variable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ echo "${toto}"
    CREATE
    TABLE MA_TABLE(
     
    $ echo ${toto}
    CREATE TABLE MA_TABLE(
     
    $ echo "${tata}"
    CREATE
    TABLE MA_TABLE (
     
    $ echo ${tata}
    CREATE TABLE MA_TABLE (
     
    $ echo $toto | sed 's/\([^ ]* \)\{2\}\([^ ][^(]*\)[ (].*/\2/'
    MA_TABLE
     
    $ echo $tata | sed 's/\([^ ]* \)\{2\}\([^ ][^(]*\)[ (].*/\2/'
    MA_TABLE
     
    $

  7. #7
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par alx13 Voir le message
    Salut,

    Tout d'abord merci à N_BaH et Sve@r pour vos réponses

    La solution du couple cut/sed marche bien quand la chaine est sur une seule ligne.
    Comme quoi les solutions les plus simples sont souvent les meilleurs

    Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.

    Je vais quand même faire le test dans le script histoire d'être sur.
    Et je vous tiens au courant.

    Merci encore.

    sed sait lire les chaines sur plusieurs lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [fpu@lne ~/tmp] cat > d
    a
    b
    ab
    [fpu@lne ~/tmp] sed "s/a.*b/c/" d  # pour changer ab sur une ligne par c
    a
    b
    c
    [fpu@lne ~/tmp] sed "N ; s/a.*b/c/" d # pour changer ab sur 2 lignes par c
    c
    ab
    [fpu@lne ~/tmp]

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r
    expr étant une commande externe, ça pourra s'utiliser que ce soit du sh, du csh, du ksh non ???
    Tout à fait.
    Cependant, bash et ksh, avec les double-crochets et le tilde initiant la comparaison avec une regex, peuvent faire "en interne" ce que fait expr.
    zsh étant encore plus puissant propose peut-être un autre moyen.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Bonjour !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "CREATE TABLE\nMA_TABLE(\ntout le reste" | tr -s '\n' ' ' |{ IFS=' (' read create table nomTable autres; echo "${nomTable}" ; }
    Note : j'aime pas sh

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    un besoin pro me fait penser à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "CREATE\tTABLE\nMA_TABLE\r(\ntout le reste"|awk -v RS='' -F'[\n\r[:space:](]' ' { print $3}'

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chardclo Voir le message
    un besoin pro me fait penser à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "CREATE\tTABLE\nMA_TABLE\r(\ntout le reste"|awk -v RS='' -F'[\n\r[:space:](]' ' {
    print $3}'
    awk !!! C'est la grosse artillerie ça. Bien sûr quand ça marche c'est sympa mais si on peut utiliser des commandes plus light, alors ça marche plus vite...

    Citation Envoyé par chardclo Voir le message
    Note : j'aime pas sh
    C'est vrai que quand on a goûté aux shells plus évolués, on a du mal. Malheureusement t'es pas toujours libre de l'environnement ciblé...
    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 éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    awk !!! C'est la grosse artillerie ça.
    Pas plus que sed à mon sens

    Citation Envoyé par Sve@r Voir le message
    [...]mais si on peut utiliser des commandes plus light, alors ça marche plus vite...

    je "milite" également dans ce sens ...C'est d'ailleurs pour cela que ma première proposition était à base de read mais qui s'appuyait sur la sortie de trEt c'est ce qui justifie ma remarque car je le trouve sh "pauvrement" fourni

    Citation Envoyé par Sve@r Voir le message
    C'est vrai que quand on a goûté aux shells plus évolués, on a du mal. Malheureusement t'es pas toujours libre de l'environnement ciblé...
    J'en "souffre" au TAF

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chardclo Voir le message
    Pas plus que sed à mon sens
    Hum... un programme câblé pour comprendre tout un langage algorithmique complet contenant des structures alternatives et répétitives + possibilité de créer des fonctions me semble un poil plus lourd qu'un programme dont le but n'est que de faire des remplacements de texte et suppression de lignes. Parce que tout ce que awk peut faire ça a quand-même un certain poids...
    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]

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 44
    Par défaut
    Oui, je suis d'accord avec toi... mais mesurer cette charge sur une seule action n'est vraiment pas significatif.

    Sur de l'itération très volumineuse, j'y apporterai de l'importance....

    Pour te donner raison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $ time echo "a"|sed -n '/.*/p' >/dev/null
     
    real    0m0.007s
    user    0m0.004s
    sys     0m0.002s
    $ $ time echo "a"|awk '/.*/' >/dev/null
     
    real    0m0.007s
    user    0m0.004s
    sys     0m0.002s
     
    $ time for i in {0..10000}; do echo "a"|awk '/.*/'; done >/dev/null
     
    real    1m9.101s
    user    0m42.878s
    sys     0m23.271s
    $ time for i in {0..10000}; do echo "a"|sed -n '/.*/p'; done >/dev/null
     
    real    0m59.822s
    user    0m41.116s
    sys     0m21.118s
    sachant bien sur que tout dépend des processus en cours d'exécution et de priorités au moment de l'exécution des instructions.

    enfin bon, c'est un éternel débat

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 110
    Par défaut
    En tout cas merci a tous pour vos réponses

    Moi qui pensais que c’était une question bateau, j'ai bien fait de poser la question



    Merci encore
    @+

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alx13 Voir le message
    En tout cas merci a tous pour vos réponses

    Moi qui pensais que c’était une question bateau, j'ai bien fait de poser la question



    Merci encore
    @+
    Ben justement c'est une question bateau !!! C'est pour ça qu'on peut tous se laisser aller à donner chacun une version différente en disant, chacun de son coté, que sa version personnelle est plus rapide et plus concise que celle des autres
    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]

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

Discussions similaires

  1. Extraction sous-chaine BASH
    Par touronster dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 06/07/2011, 09h53
  2. extraction sous chaines -> Excel
    Par rienDeComplique dans le forum VBA Word
    Réponses: 6
    Dernier message: 03/09/2009, 17h50
  3. Extraction sous chaine regexp
    Par photorelief dans le forum Langage
    Réponses: 1
    Dernier message: 23/05/2009, 20h07
  4. extraction sous chaine
    Par ouinih dans le forum Langage
    Réponses: 6
    Dernier message: 28/01/2009, 11h49

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