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 :

Recherche d'un texte dans une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut Recherche d'un texte dans une variable
    Bonjour,

    En KSH, je récupère dans une variable le chemin vers un fichier :
    CHEMIN=/apps/data/generic/METIERA/in/test.csv

    Le problème que je rencontre est que j'essaye de trouver un moyen pour récupérer la chaine "METIERA", sachant qu'elle se trouve forcément après "generic" mais que la partie de l'arborescence avant generic (/apps/data) est variable (car ce chemin peut varier d'un serveur à un autre).
    J'ai essayé de combiner le grep et le awk mais je reste bloqué depuis un moement. Si quelqu'un à une idée
    Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $CHEMIN | sed -e 's#.*/generic/##' -e 's#/.*##'
    's#.*/generic/##' > supprime le texte depuis le début jusqu'au terme /generic/

    's#/.*##' > supprime depuis le premier / (une fois qu'on a retiré le début) jusqu'à la fin

    y'a peut-être plus simple

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 81
    Points : 80
    Points
    80
    Par défaut
    Merci t'es le meilleur!!!! je galérais depuis 9h...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    En un peu plus exotique avec la commande expr trop rarement utilisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    expr $CHEMIN : '^.*generic/\([^/]\+\)/.*$'
    Ou avec un seul passage par sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $CHEMIN | sed 's@.*/generic/\([^/]\+\).*@\1@'

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    Par défaut
    KSH permet la substitution des paramètres (Parameter Expansion)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ CHEMIN=/apps/data/generic/METIERA/in/test.csv
    $ metier=${CHEMIN/*\/generic\//}
    $ metier=${metier%%/*} 
    $ echo $metier
    METIERA
    edit : l'editeur de flux est superflu !

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Bon, je bosse sur des vieux Unix, donc forcément, je suis plus limité (seule la dernière proposée par N_BaH fonctionne sur mon petit HP-UX :p) mais par curiosité, j'ai fait un rapide bench des 4 propositions sur un Linux:

    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
    22
    23
    24
    25
    26
    27
    28
     
    CHEMIN2=`echo $CHEMIN | sed -e 's#.*/generic/##' -e 's#/.*##'`
     
    real    0m9.071s  0m9.255s  0m9.124s
    user    0m4.036s  0m3.832s  0m3.636s
    sys     0m6.312s  0m6.936s  0m6.044s
     
    --------------------------------------------------
    CHEMIN2=`expr $CHEMIN : '^.*generic/\([^/]\+\)/.*$'`
     
    real    0m6.299s  0m6.195s  0m6.160s
    user    0m2.792s  0m3.288s  0m2.332s
    sys     0m2.976s  0m3.088s  0m3.016s
     
    --------------------------------------------------
    CHEMIN2=`echo $CHEMIN | sed 's@.*/generic/\([^/]\+\).*@\1@'`
     
    real    0m9.718s  0m9.837s  0m9.978s
    user    0m4.156s  0m3.852s  0m4.700s
    sys     0m7.104s  0m6.412s  0m5.540s
     
    --------------------------------------------------
    metier=${CHEMIN/*\/generic\//}
    CHEMIN2=${metier%%/*}
     
    real    0m0.284s  0m0.285s  0m0.283s
    user    0m0.232s  0m0.220s  0m0.200s
    sys     0m0.052s  0m0.064s  0m0.080s
    Comme qui dirait, y a pas photo si on a le bon ksh et qu'on connait les trucs ! Par contre, quelqu'un pourrait expliquer un peu la solution de N_BaH qui est, comme d'habitude, bonne mais pas documentée ?

    edit: le script de "bench"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/local/bin/bash
     
    for i in {1..1000}
    do
            CHEMIN=/apps/data/generic/METIERA_$i/in/test.csv
            #CHEMIN2=`echo $CHEMIN | sed -e 's#.*/generic/##' -e 's#/.*##'`
            #CHEMIN2=`expr $CHEMIN : '^.*generic/\([^/]\+\)/.*$'`
            #CHEMIN2=`echo $CHEMIN | sed 's@.*/generic/\([^/]\+\).*@\1@'`
            metier=${CHEMIN/*\/generic\//}
            CHEMIN2=${metier%%/*}
            echo $CHEMIN2 >> test...
    done
    Bon, c'est du rapide :$

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 595
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 595
    Points : 19 477
    Points
    19 477
    Par défaut
    Par contre, quelqu'un pourrait expliquer un peu la solution de N_BaH qui est, comme d'habitude, bonne mais pas documentée ?

    man ksh /Parameter Expansion.

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

Discussions similaires

  1. Recherche de texte dans une variable
    Par Ninpa dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/01/2010, 10h50
  2. [vb-net] Recherche de texte dans une variable
    Par skaraa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/09/2007, 17h48
  3. Enregistrer la saisie d'un text dans une variable.
    Par dazed_dive dans le forum Flash
    Réponses: 4
    Dernier message: 16/04/2007, 11h57
  4. Réponses: 3
    Dernier message: 06/09/2006, 10h06
  5. Plusieurs lignes de texte dans une variable texte
    Par Loko dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 15/12/2005, 13h51

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