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 18/01/2011, 17h08   #1
Membre du Club
 
Inscription : octobre 2006
Messages : 105
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 105
Points : 48
Points : 48
Par défaut Regex : Recherche chaine de caractère dans une autre chaine de caractère (Unix)

Bonjour,
Je suis débutant sous UNIX, je cherche une commande qui permet de rechercher puis afficher une chaine de caractère qui correspond à une expression régulière.
Exemple:
Je cherche la chaine qui correspond à une date dans un nom de fichier.

Code :
1
2
3
4
5
6
7
 
DATE='([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})'
for file in $(ls $LOGFOLDER -1 $1)
do
ok=echo $file | grep -E $DATE 
echo $ok
done
Mais malheureusement ça ne marche pas. Merci beaucoup pour votre aide.
framus.class est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 18h07   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
Bonjour,

on ne fait pas for item in $(commande), car si commande retourne une ligne contenant des espaces, la boucle s'exécutera sur chacun des éléments de la ligne.
Code :
1
2
3
4
5
for file in ton_Repertoire/*
do if [[ $file =~ [0-9]{4}-[0-9]{1,2}-[0-9]{1,2} ]]
   then echo "$file"
   fi
done
cf. help [[
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/01/2011, 20h04   #3
Membre du Club
 
Inscription : octobre 2006
Messages : 105
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 105
Points : 48
Points : 48
Bonjour et merci pour ton aide.

Citation:
Envoyé par N_BaH Voir le message
on ne fait pas for item in $(commande), car si commande retourne une ligne contenant des espaces, la boucle s'exécutera sur chacun des éléments de la ligne.
ça c'est pas un problème car si la commande retourne des ligne avec des espace ces derniers ne vont pas matcher avec la regex.

J'ai fini par trouver


Code :
1
2
3
4
5
6
7
DATE='([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})'
for file in $(ls $LOGFOLDER -1 $1)
do
souschaine=$(echo $file | grep -E -o $DATE )
echo $souschaine
done
framus.class est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 20h41   #4
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 978
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 978
Points : 5 993
Points : 5 993
Bonsoir.

Citation:
Envoyé par framus.class Voir le message
ça c'est pas un problème car si la commande retourne des ligne avec des espace ces derniers ne vont pas matcher avec la regex.
En effet, mais c'était histoire de ne pas prendre de mauvaises habitudes (dont j'ai hérité aussi ), surtout quand on a une ou des alternatives .

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 21h36   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 069
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 069
Points : 4 145
Points : 4 145
c'est pas un problème jusqu'à ce que cela en devienne un :
Code :
1
2
3
4
5
6
mkdir testDir
touch testDir/monFichier 'testDir/mon Fichier'$(date +%Y-%m-%d)
for i in $(ls testDir/*); do [[ $i =~ [0-9]{4}-[0-9]{1,2}-[0-9]{1,2} ]] && echo "$i"; done
Fichier2011-01-18
for i in testDir/*; do [[ $i =~ [0-9]{4}-[0-9]{1,2}-[0-9]{1,2} ]] && echo "$i"; done
testDir/mon Fichier2011-01-18
!
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 22h05   #6
Membre du Club
 
Inscription : octobre 2006
Messages : 105
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : octobre 2006
Messages : 105
Points : 48
Points : 48
Je confirme que dans mon cas ceci ne pose pas de problème puisque je veux récupérer la date contenue dans le nom de mon fichier et non pas le nom lui même, mais je tiens a te remercier tout de même pour cette bonne pratique que je tacherais d'appliquer
framus.class est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h49.


 
 
 
 
Partenaires

Hébergement Web