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 :

[bash] récupérer la première occurence d'une série de digits dans une string


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut [bash] récupérer la première occurence d'une série de digits dans une string
    Bonjour à tous,

    ça fait un bon moment que je m'énèrve là-dessus.
    J'ai fait un script bash qui fonctionne bien sous Linux mais qui ne marche pas sous MacOS.

    Là où ça pèche, c'est que j'ai des strings de ce style:
    123_bob_marley_03_2011_09
    foo_776
    blablobli_78876__33plop

    Et j'aimerais récupérer uniquement la première série de digits se trouvant n'importe où dans la string. Pour mon exemple, cela donnerait:
    123
    776
    78876

    Avec sed, j'arrive à enlever tout ce qui vient éventuellement avant la série de digit:

    mais pas ce qui vient après.
    Si j'utilise le g, le problème c'est que je récupère toutes les séries de digits, ce que je ne veux pas:

    Juste pour information, voici le script en entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    while read file; do
    	BASE=$(basename "$file")
    	ID=$(sed 's/[^0-9]*//' <<< ${BASE%.*})
    	if [ -n "$ID" ] ; then
    		mkdir -p "$ID"
    		mv -v "$file" "$ID"
    	fi
    done < <(find . -maxdepth 2 -iname '*.jpg' -or -iname '*.jpeg' -or -iname '*.mov' -or -iname '*.xml')

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat plop
    123_bob_marley_03_2011_09
    foo_776
    blablobli_78876__33plop
    
    $ sed -n 's/\([^[:digit:]]*\)\([[:digit:]]*\).*/\2/p' plop
    123
    776
    78876
    $

  3. #3
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    avec sed

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sed -e 's/[^0-9]*\([0-9][0-9]*\).*/\1/' FICHIER
    avec awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk '{ print gensub("[^0-9]*([0-9][0-9]*).*$","\\1","1") }' FICHIER

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Waaa, c'est nickel! Je bataillais dessus depuis un moment!
    La solution de zipe31 marche parfaitement, je n'ai pas testé celle de becket mais je vais y jeter un oeil attentif

    Merci beaucoup à vous deux!

  5. #5
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Celle de becket est de loin la plus optimisée et bien plus simple* que ma mienne, à privilégier de ce fait


    * M'enfin, pourquoi ferai-je simple quand je peux faire compliqué, hein ?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  2. Evaluer une série de valeurs dans une StringGrid
    Par fermat dans le forum Delphi
    Réponses: 1
    Dernier message: 24/09/2006, 18h35
  3. Réponses: 9
    Dernier message: 05/04/2006, 17h48
  4. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 12h51
  5. Réponses: 2
    Dernier message: 17/08/2005, 14h40

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