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 :

Filtre médiathéque


Sujet :

Linux

  1. #1
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut Filtre médiathéque
    Bonjour,
    je débute avec les scripts shell et je dois avouer que je suis vraiment bloqué sur un problème.
    Je suis en train d'écrire un script pour faire une "médiathéque" mp3.
    En paramètre de ce script on pourra filtrer les fichiers musicaux en fonction des méta-informations qu'ils contiennent.Par exemple,
    pour obtenir toutes les chansons de rock ou hard rock etc...,il faudra utiliser un paramètre -f avec la commande suivante genre="rock"|"hard-rock"
    ensuite on me demande de faire en sorte qu'on puisse utiliser l'étoile (*) dans les filtres .

    la 1ere chose que je fais c'est que j'analyse tous les paramètres qu'on passe au script
    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
     
          for ((i=1;i<=$#;i++))
     
           do
     
                if [ "${!i}" = "-f" ]
     
                then
     
                   param1=$(($i+1)) #contient le paramètre qui suit -f
     
                   filmedia ${param1} #filmedia est une fonction qui va filtrer la     médiathèque
     
                else echo "parametre non valide"
     
          done
    mon 1er problème : il faut que je substitue les paramètres à mesure que je m'en sers. En effet le paramètre qui suit -f ne doit pas être traité dans la boucle car sinon il va afficher paramètre non valide.Il faut que je l'envoie dans la fonction filmédia (ça c'est bon) mais ensuite il faut que je le substitue pour pas qu'il soit interprété dans la boucle à la sortie...

    voici un bout de la fonction filmedia (les autres entrées du case sont construites de la même manière)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          function filmedia(){
     
          case "$1" in
     
          "titre="*)
     
               media $racine |cut -f 2 -d ":" | grep
     
          #media $racine renvoie tous les mp3 contenues dans un répertoire sous la forme
     
          #MP3 n° ? : titre : album : artiste : genre : année
    Si le parametre $1 commence par "titre=" il faut trier par titre
    -->mon 1er probleme est que j'aimerai faire un grep sur le 2eme champ de la sortie media $racine mais sans couper! avec ce sript je ne renvoie que les titres alors que je veux renvoyer toute la ligne...Mais si je ne fais pas de cut il fait un grep sur la ligne, pas sur le 2eme champ de la ligne.

    -->mon 2eme probleme je ne sais pas comment passer le reste du parametre à grep.Si l'utilisateur marque titre="test" il faut passer grep -w "test"
    alors que si il marque titre="test"|"chanson" il faut passer quoi??
    c'est bon ça? grep '(\test\|chanson\)'

    --> et puis vous avez une idée de comment se servir de l'etoile
    si l'utilisateur met titre="test*" il faut gérer toute les lignes avec un titre qui commence par test si je fais un grep test (sans le -w) il va afficher toute les lignes qui contiennent test pas seulement celles qui commencent par test.


    Je remercie d'avance toute personne pouvant me venir en aide
    Yoshi

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Faire ça en shell c'est pas très raisonnable... Ce serait beaucoup plus facile (et surtout nettement plus performant) de le faire en Perl.

    --
    Jedaï

  3. #3
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    je sais, mais bon je choisis pas mes énoncés de TP
    C'est vrai que c'est atroce en shell

  4. #4
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut Re: [shell](débutant)filtre médiathéque
    Salut

    Il est sympa ce truc

    Premier probleme : utilise une expression reguliere sur toute la ligne, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -i "^[^:]*:[^:]*:$needle:"
    Second probleme : oui, c'est ok (a la faute de frappe pres). Si tu utilise des expressions rationelles etendues (egrep ou grep -E) tu peux ecrire les filtres plus lisiblement : "(truc|muche)"

    Troisème probleme : Ben il faut remplacer * par "[^:]*" dans ton expression rationelle (histoire de rester dans ton champ.)

    Bon courage !

  5. #5
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Merci de ta réponse,
    J'ai du mal à utiliser les expressions régulières
    quelqu'un ma conseillé d'utiliser awk plutot que grep
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    media $racine | awk -F':' '( $2 == "nom album" ) { print $0 }'
    Qu'en pensez vous?

  6. #6
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Personellement j'utilise awk pour faire des filtres multilignes car un peu generalement utiliser les ajutrers outils pour faire du "ligne par ligne", mais il n'y a pas de grande différence !

  7. #7
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Smortex je te remercie pour tes precieux conseils.
    J'ai appliqué ta technique et ça fonctionne parfaitement.
    Néanmoins j'aimerai quelques éclairssissements sur les expression régulières:
    ^ --> le début de la ligne
    [^:] --> c'est ça que j'arrive pas tres bien à comprendre (séquence de caractère qui commence par ":" c'est ça?)
    *--> répétition de 0 à n fois de la séquence qui précéde
    : --> le caractère ":" qui délimite les champs

    je suis arrivé à faire fonctionner le tout en comptant les caractères délimiteurs.ainsi pour atteindre le 3ème champs (2délimiteurs ":" le précéde), je fais :
    ^[^:]*:[^:]*: variable :[^:]*

    Excuse le ridicule de la question mais bon, je pouvais pas me contenter d'un script qui fonctionne, fallait que je comprennes

  8. #8
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Encore une petite question,
    le script fonctionne très bien tant que je ne mets pas d'espace avec les expressions regulieres étendues

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep -i  "^[^:]*:[^:]*: "(musiquesansespace1|musiquesansespace2)" :[^:]* "  #ca fonctionne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    egrep -i  "^[^:]*:[^:]*: "(musique avec espace1|musique avec espace2)" :[^:]* " #ça fonctionne pas
    ça renvoie l'erreur expression régulière invalide
    Comment faire pour qu'il n'interprète pas les espaces?

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 17h40
  2. JFileChooser et filtre sur autre chose que l'extension.
    Par Djobird dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/03/2007, 16h19
  3. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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