Comment faire une negation d'une expression reguliere?

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)

Un dieu des regexp qui pourrait m’aider?

Merci d’avance

LoneWolf
Les regexp, c’est illisible!

Logiquement, un ^(^cafzone)$ devrait suffire (puisque oui, le ^ sert aussi de négation) (enfin, au moins en c#)

ben oui mais non. Voici un exemple:

lonewolf@tempserver:/tmp$ cat test
titi
toto
toutou
bouh
alpha
geant

lonewolf@tempserver:/tmp$ grep -E “^(^to)” test
toto
toutou
lonewolf@tempserver:/tmp$ grep “^(^to)” test
(renvoie rien)

grep sans option, c’est les regexp normale et grep -E, c’est les regexp etendues.

D’autres idees?

LoneWolf
C’est standard, les regexp?

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…

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.

Mais merci pour l’astuce, ca peut toujours servir

LoneWolf
two more to go.

[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

LoneWolf
Osons les exercices.

bah n’affiche pas la première ligne ^^
(y’a une option a la con ou une autre commande utilisable avec un tube)

Aaaah, mais fallait préciser que c’était avec le copain awk.

ps aux | awk ‘$1 !~ /^USER/’

Et ca marche sur mon serveur

waaa trop fort mon bishop

Ceci dit, il n’y a pas de methode standard qui marche avec tous les logiciels, c’est penible ca…

LoneWolf
Osons les standards

la syntaxe (?!pattern) doit fonctionner.

cf. http://msdn.microsoft.com/library/default…egexpsyntax.asp