Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/05/2011, 12h37   #1
Invité de passage
 
Inscription : octobre 2009
Messages : 13
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : octobre 2009
Messages : 13
Points : 4
Points : 4
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 :
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')
Sherwood51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2011, 13h39   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
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
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 21/05/2011, 13h50   #3
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
avec sed

Code :
1
2
 
 sed -e 's/[^0-9]*\([0-9][0-9]*\).*/\1/' FICHIER
avec awk

Code :
1
2
 
 awk '{ print gensub("[^0-9]*([0-9][0-9]*).*$","\\1","1") }' FICHIER
becket est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 21/05/2011, 13h56   #4
Invité de passage
 
Inscription : octobre 2009
Messages : 13
Détails du profil
Informations personnelles :
Âge : 25
Localisation : Suisse

Informations forums :
Inscription : octobre 2009
Messages : 13
Points : 4
Points : 4
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!
Sherwood51 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2011, 16h17   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 ?
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h31.


 
 
 
 
Partenaires

Hébergement Web