Commande wc et regex
Résolu/Fermé
Utilisateur anonyme
-
Modifié par vivelasuisse le 17/12/2011 à 12:37
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 - 18 déc. 2011 à 00:39
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 - 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
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 sfc scannow - Guide
3 réponses
mamiemando
Messages postés
33591
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 mars 2025
7 834
17 déc. 2011 à 13:08
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 :
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
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 422
17 déc. 2011 à 13:16
17 déc. 2011 à 13:16
Salut,
Merci de ne pas doublonner ;-(
Merci de ne pas doublonner ;-(
mamiemando
Messages postés
33591
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 mars 2025
7 834
18 déc. 2011 à 00:39
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 :
Solution proposée par zipe31 :
grep -io [aeiouy] fichier.txt | wc -l