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 :

[BASH] extraire une chaine d'une autre


Sujet :

Linux

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Points : 396
    Points
    396
    Par défaut [BASH] extraire une chaine d'une autre
    Bonjour,

    Je cherche le moyen d'extraire une chaine d'une autre, en bash.. exemples de chaines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream #0.1: Video: WVP2 / 0x32505657, 320x240, 6 kb/s, 30.00 tb(r)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream #0.1: Video: wmv3, yuv420p, 320x240, 400 kb/s, 29.97 tb(r)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream #0.0[0x1e0]: Video: mpeg1video, yuv420p, 352x288 [PAR 1:1 DAR 11:9], 1024 kb/s, 25.00 tb(r)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream #0.0: Video: mpeg4, yuv420p, 352x288, 25.00 tb(r)
    de ces chaine, je dois extraire le nombre de frame par secondes, "30.00", "29.97", "25.00"

    je ne connais pas trop la programmation bash..

    pour le moment mon script c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    ffmpeg -i "$1" &> fps.txt
    ligne=$(grep 'Video: ' fps.txt)
    x=0
    for i in `echo $ligne | tr "," " "`;
    do
        echo $i;
        x=$((x+1));
        liste[$x]=$i;
    done
    echo ${liste[9]}
    le ${liste[9]} marche pour certaines, mais pas toutes.. donc a bannir comme methode..

    mais la je tourne en rond depuis un moment alors que ca doit etre tout bete.. une astuce ?

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 867
    Points : 4 873
    Points
    4 873
    Par défaut
    Bonjour

    Tu devrais regarder les commandes cut et sed. Elles sont très utiles dans l'exploitation de chaînes de caractères.

    @++

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Le plus lisible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/^.+([0-9]{2}\.[0-9]{2}) tb.+/\1/' tonFichier
    Le plus portable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/^.\+\([0-9]\{2\}\.[0-9]\{2\}\) tb.\+/\1/' tonFichier

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Points : 396
    Points
    396
    Par défaut
    Grand merci ! ca marche tres bien avec sed ! mais je dois avouer que les expressions regulieres, j'ai du mal !

    au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    ffmpeg -i "$1" &> fps.txt
    test3=$(grep 'Video: ' fps.txt)
    echo "$test3" > fps.txt
    test4=$(sed 's/^.\+\([0-9]\{2\}\.[0-9]\{2\}\) tb.\+/\1/' fps.txt)
    echo $test4

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Tu te compliques la vie et, surtout, ton code risque d'être gourmand pour ta machine, surtout pour des fichiers importants. Tu peux atteindre le même résultat avec un one-liner sed avec juste un pipe depuis ta commande ffmpeg:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ffmpeg -i "$1" | sed -r '/Video/!d; s/^.+([0-9]{2}\.[0-9]{2}) tb.+/\1/'

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/10/2011, 12h45
  2. [RegExp] y a-t-il plus simple pour extraire sous-chaine d'une chaine ?
    Par laurentSc dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 17/03/2011, 18h16
  3. Réponses: 7
    Dernier message: 25/02/2011, 14h06
  4. Réponses: 1
    Dernier message: 18/04/2007, 18h07
  5. Réponses: 2
    Dernier message: 19/10/2005, 16h38

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