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 :

[SHELL] Opération sur chaine de caractère


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 109
    Par défaut [SHELL] Opération sur chaine de caractère
    Bonjour à tous,

    J'ai un petit souci en shell (je ne m'y connais pas trop) :

    Voila mon problème :
    Je récupere une chaine de caractère depuis un fichier source (donné en paramètre) ma chaine se dessine sous cet forme :
    /{espace}toto/{espace}tete/{espace}titi/{espace}tata/

    Le but du jeu c'est donc d'avoir le chemin en entier et correct :
    /toto/tete/titi/tata/
    Bizarrement, je n'ai pas réussi à supprimer les espaces (test avec la commande tr ou awk).
    Du coup j'ai utilisé un moyen de contournement que voici

    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
     
    chemin_source=`grep ^lcd $1|awk '{print $2 }'`
    fichier=`grep ^put $1|awk '{print $2 }'`
    echo $fichier
    lg_chaine=`expr ${#fichier} - 1`
    file=`echo $fichier|cut -c 2-$lg_chaine`
    echo $file
    echo $chemin_source
    dossier_source1=`echo $chemin_source|cut -f1 -d" "`
    dossier_source2=`echo $chemin_source|cut -f2 -d" "`
    dossier_source3=`echo $chemin_source|cut -f3 -d" "`
    dossier_source4=`echo $chemin_source|cut -f4 -d" "`
    dossier_source5=`echo $chemin_source|cut -f5 -d" "`
    echo $chemin_source|cut -f15 -d" "
    separateur="/"
    chemin_source="$dossier_source1""$dossier_source2""$separateur""$dossier_source3""$separateur""$dossier_source4""$separateur""$dossier_source5""$separateur""$file"
    echo $chemin_source
    Donc tout va bien je récupere bien mon information correctement. Maintenant je souhaiterais rendre ça dynamique.
    Parce que dans le code ci dessus je suppose que le chemin possede 5 repertoire ce qui n'est pas toujours le cas.

    Auriez vous une piste ?

    Merci beaucoup !

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    en passant par le Remplacement des paramètres (cf. man bash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    fichier=$1
    [ -f "$fichier" ] && {
       chemin="${fichier%/*}"
       chemin="${chemin// /}"
    }
    [ -d "$fichier" ] && chemin="${chemin// /}"
     
    echo "$chemin" #juste pour vérifier
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    tu peux aussi utiliser sed, dirname et basename
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/ksh
    fichier="/ toto/ tete/ titi/ tata/ abc / def / g h i / twd "
    echo "Nom original                 : "$fichier
     
    fichier=`echo ${fichier} | sed 's/ //g'`
    echo "Apres suppression des espaces: "$fichier
     
    fichier=`dirname $fichier`
    echo "Apres appel a dirname        : "$fichier
     
    fichier=`basename $fichier`
    echo "Apres appel a basename       : "$fichier
    Resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Nom original                 : / toto/ tete/ titi/ tata/ abc / def / g h i / twd
    Apres suppression des espaces: /toto/tete/titi/tata/abc/def/ghi/twd
    Apres appel a dirname        : /toto/tete/titi/tata/abc/def/ghi
    Apres appel a basename       : ghi

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 109
    Par défaut
    Merci pour vos réponses,

    J'avais déjà essayer pour supprimer les espaces le sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier=`echo ${fichier} | sed 's/ //g'`
    Cela me renvoie ma chaine avec les espaces je ne comprends pas pourquoi lorsque j'essaie "en dur" cela passe bien mais sinon ca ne marche pas.
    C'est vrai que la méthode dirname et basename est beaucoup plus clair que mon code !

    Pour la méthode de N_BaH le premier parametre correspond à mon "fichier ou à la ligne espacée" ?

  5. #5
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par chleuh Voir le message
    Merci pour vos réponses,

    J'avais déjà essayer pour supprimer les espaces le sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier=`echo ${fichier} | sed 's/ //g'`
    Cela me renvoie ma chaine avec les espaces je ne comprends pas pourquoi lorsque j'essaie "en dur" cela passe bien mais sinon ca ne marche pas.
    C'est vrai que la méthode dirname et basename est beaucoup plus clair que mon code !

    Pour la méthode de N_BaH le premier parametre correspond à mon "fichier ou à la ligne espacée" ?
    Qu'entends-tu par 'lorsque j'essaie "en dur" cela passe bien mais sinon ca ne marche pas.', surtout le ne marche pas?

    Avec un read:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/ksh
    read str?"Saisir une chaine       : "
    echo "Chaine lue              :" $str
     
    str=`echo ${str} | sed 's/ //g'`
    echo "Chaine lue sans espaces :" $str
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Saisir une chaine       : ceci est une chaine 
    Chaine lue              : ceci est une chaine 
    Chaine lue sans espaces : ceciestunechaine
    En passant des arguments:
    Attention les ' ' sont importantes car l'espace est le séparateur normal des arguments d'une ligne de commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/ksh
    arg=$1
    echo "Argument              :" $arg
     
    arg=`echo ${arg} | sed 's/ //g'`
    echo "Argument sans espaces :" $arg
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ksh test.ksh 'ceci est un seul argument'
    Argument              : ceci est un seul argument
    Argument sans espaces : ceciestunseulargument

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 109
    Par défaut
    C'est bon mon problème est reglé !!! Merci à vous!!
    En fait lorsque sur mon invite de commande j'écrivais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "toto est gentil" | sed 's/ //g'
    j'ai bien totoestgentil en résultat
    par contre dans mon script lorsque je lui donnais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    fichier=`echo ${fichier} | sed 's/ //g'`
    echo $fichier
    Les espaces n'étaient pas supprimés.
    Je ne comprends pas mais maintenant ca marche! J'ai du comme tu l'a dit saisir la mauvaise commande Merci !

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

Discussions similaires

  1. opération sur chaine de caractères
    Par Matmal11 dans le forum Linux
    Réponses: 4
    Dernier message: 31/01/2007, 11h47
  2. Travail sur chaines de caractères
    Par g.greg45 dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2006, 19h11
  3. [Tableaux] Opération sur chaîne de caractères
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 14h32
  4. Travail sur chaine de caractère
    Par corben dallas dans le forum Access
    Réponses: 4
    Dernier message: 02/01/2006, 19h22
  5. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14

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