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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 835
    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 835
    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
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    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
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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 : 48
    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]

+ 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