Commande wc et regex

Résolu/Fermé
Utilisateur anonyme - Modifié par vivelasuisse le 17/12/2011 à 12:37
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 18 déc. 2011 à 00:39
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

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
17 déc. 2011 à 13:08
Ç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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
17 déc. 2011 à 13:16
Salut,

Merci de ne pas doublonner ;-(
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
18 déc. 2011 à 00:39
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