Commande wc et regex

Résolu
vivelasuisse -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai un problème. Je recherche une commande qui me permet de compter toutes les voyelles d'un textes (autant majuscule et minuscule). Cette commande (qui les mets juste en couleur) marche: more Compte_Voyelles | grep 'a*e*i*o*u'
Cette commande me met en couleur les voyelles, mais pas toute! j'ai dans le texte encore des e et des i et des e et des o qui ne sont pas en rouge..
Et dès que j'y rajoute un y, sa ne marche plus, comme quand je rajoute ces même lettres en majuscule. Et je n'arrive pas a utiliser la commande wc -m pour compter ces voyelles.
Si vous connaissez une commande ou un regex ajouter a la commande egrep qui permet de garder que les voyelles, avec plaisir!

Merci d'avance

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Ça ne marchera pas car ton expression régulière signifie n'importe quelle chaîne constituée d'une suite de 0 ou plus caractère 'a', suivi d'une suite de 0 ou plus caractère 'e' etc...

    Tu n'as donc aucune chance de compter le nombre de voyelle de cette manière.

    Pour moi il n'y a pas de solution à base d'expression rationnelle simple dans ton cas. Ou alors il faudrait que tu aies un caractère par ligne, ce qui peut se faire mais qui nécessite une transformation préalable (et d'autant plus coûteuse que ton texte est long). Bref, c'est pas top.

    Approche à mon avis plus simple, tu lis simplement le fichier caractère par caractères et tu affiches le résultat. Tu peux le programmer dans le langage que tu veux.

    char_distribution.cpp :

    #include <map>
    #include <iostream>
    #include <cstdio>
    #include <string>
    
    typedef std::map<char, unsigned> distribution_t;
    
    int main(int argc, char **argv){
        distribution_t   distribution;
        char * filename;
        FILE * fp;
        char   c;
    
        // Contrôler le nombre d'arguments
        if(argc != 2) {
            std::cerr << "usage: " << argv[0] << " input_filename" << std::endl;
            return 1;
        }
        filename = argv[1];
        fp = fopen(filename, "r");
    
        // Vérifier que le fichier existe et peut être ouvert
        if(!fp){
            std::cerr << argv[0] << ": can't read " << filename << std::endl;
            return 2;
        }
    
        // Lire tout le fichier et comptabilise le nombre d'apparition
        // de chaque caractère
        while((c = fgetc(fp)) != EOF){
            ++distribution[c];
        }
    
        // Afficher la distribution
        {
            distribution_t::const_iterator
                distribution_it (distribution.begin()),
                distribution_end(distribution.end());
            for(;distribution_it != distribution_end; ++distribution_it){
                std::cout << distribution_it->first  << '\t'
                          << distribution_it->second << std::endl;
            }
        }
    
        // Afficher le nombre de voyelles
        const char *voyelles = "aeiouyAEIOUY";
        unsigned num_voyelles = 0;
        for(const char *pvoyelle = voyelles; *pvoyelle; ++pvoyelle){
            num_voyelles += distribution[*pvoyelle];
        }
        std::cout << num_voyelles << " voyelles" << std::endl;
    
        return 0;
    }


    On compile le tout :

    g++ -W -Wall plop.cpp -o char_distribution char_distribution.cpp


    On crée un petit fichier texte de test et on lance le programme (texte.txt) :

    J'aime les tapirs
    J'AIME LES LOUTRES


    ... et on lance le programme :

    ./char_distribution texte.txt


    ... ce qui donne :

    (mando@aldur) (~) $ cat texte.txt
    J'aime les tapirs
    J'AIME LES LOUTRES
    
    (mando@aldur) (~) $ ./char_distribution texte.txt
    
            2
            4
    '       2
    A       1
    E       3
    I       1
    J       2
    L       2
    M       1
    O       1                                                                                                                                                                           
    R       1                                                                                                                                                                           
    S       2                                                                                                                                                                           
    T       1                                                                                                                                                                           
    U       1                                                                                                                                                                           
    a       2                                                                                                                                                                           
    e       2                                                                                                                                                                           
    i       2                                                                                                                                                                           
    l       1                                                                                                                                                                           
    m       1                                                                                                                                                                           
    p       1                                                                                                                                                                           
    r       1                                                                                                                                                                           
    s       2                                                                                                                                                                           
    t       1                                                                                                                                                                           
    13 voyelles


    Bonne chance
    0
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Merci de ne pas doublonner ;-(
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Oui d'autant plus que la commande que tu donnes dans cet autre fil de discussion fonctionne :-) Merci au passage à toi zipe31 pour l'option -o que je ne connaissais pas.

    Solution proposée par zipe31 :

    grep -io [aeiouy] fichier.txt | wc -l
    0