Commande wc et regex
Résolu
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
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
A voir également:
- Commande wc et regex
- Invite de commande - Guide
- Commande terminal mac - Guide
- Commande dism - Guide
- Diskpart commande - Guide
- Commande scannow - Guide
3 réponses
Ç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 :
On compile le tout :
On crée un petit fichier texte de test et on lance le programme (texte.txt) :
... et on lance le programme :
... ce qui donne :
Bonne chance
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