Bon, a priori, les regexp, c’est de la programmation, non?
Mon probleme est simple: je sais pas complemente une expression reguliere.
Exemple:
“^cafzone” match toutes les lignes qui commence par ‘cafzone’
Moi, je veux l’inverse: match toutes les lignes qui ne commencent PAS par ‘cafzone’. Un truc du style “! ^cafzone”. J’ai cherche dans google et sur plusieurs bouquins (online ou non) et j’ai pas trouve de negation (a part celle qui existe pour les [] mais c’est trop limite car ca ne marche que pour la premiere lettre)
Si ton expression régulière n’a pour but que d’être exploitée par grep, il te suffit de spécifier l’option -v à grep. Cette option retourne l’inverse de ce qui correspond à ton expression…
[quote]aah oui desole, j’aurais du etre plus precis:
En fait, grep n’etait qu’un exemple mais a priori, ca servira aussi bien sur grep, sed ou awk.[/quote]Heu, une negation d’une RE dans un sed pour une substitution je sais pas si c’est une bonne idée
Mais en general une regexp c’est utilisé en tant qu’expression booleene (suivant si le texte match ou pas), et la negation se fait en dehors, et la facon de le faire, ca depend du language que t’utilises.
Par exemple en perl si tu veux afficher les lignes qui commencent pas par cafzone tu écris “print $_ unless /^cafzone/”.
Dans quel cas as tu besoin de faire la negation directement dans la regex ?
en fait, j’ai fait un cours sur awk et j’ai propose un exo tres simple:
lancer un “ps aux” et compter le nombre de processus pour chaque utilisateur. Le probleme, c’est que ps affiche aussi cette ligne:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Il faut donc faire un test dans le END pour ne pas afficher USER.
On a cherche a faire un truc plus propre avec une regexp:
! ^USER { #compter les users;
}
Typiquement:
Si la ligne ne commence pas par USER, on compte les utilisateurs.
Note: l’idee n’est pas de trouver une meilleure methode pour faire le calcul, mais bien d’apprendre a utiliser les regexp et awk, hein. Je precise, au cas ou