Pages : 1
#1 Le 01/10/2010, à 05:17
- ehmicky
Problèmes regexps
Salut à tous,
Je recherche une regexp (type sed) pouvant correspondre à toute suite de caractères sauf si cette suite contient non pas un, ou l'un des caractères mais une suite précise de caractères donnée.
Exemple : toute suite de caractères ne contenant pas "abcde" :
Wabcdz #Ok
Wabcd #Ok
Wabded #Ok
Wabcde #Pas Ok
je recherche une regexp, pas une ligne de commande !
merci beaucoup !
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#2 Le 01/10/2010, à 08:42
- Totor
Re : Problèmes regexps
Bonjour,
pas moyen, t'es obligé de le faire en 2 fois.
style
grep 'W' fichier|grep -v 'Wabcde'
Dernière modification par Totor (Le 01/10/2010, à 09:02)
-- Lucid Lynx --
Hors ligne
#3 Le 01/10/2010, à 08:50
- Postmortem
Re : Problèmes regexps
Salut,
je ne sais pas si c'est exactement ce que tu recherches mais je tente quand même :
$ cat test.txt
Wabcdz #Ok
Wabcd #Ok
Wabded #Ok
Wabcd e #Ok
Wabcde #Pas Ok
Wabcdef #Pas Ok
$ sed 's/\(.*\)[!a][!b][!c][!d][!e]\(.*\)/\1\2/' test.txt
Wabcdz #Ok
Wabcd #Ok
Wabded #Ok
Wabcd e #Ok
W #Pas Ok
Wf #Pas Ok
La regexp serait donc : .*[!a][!b][!c][!d][!e].*
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#4 Le 01/10/2010, à 09:03
- Totor
Re : Problèmes regexps
@Postmortem : si c'est bon
-- Lucid Lynx --
Hors ligne
#5 Le 01/10/2010, à 09:13
- survietamine
Re : Problèmes regexps
bizarre :
cat test.txt | grep -E '.*[!a][!b][!c][!d][!e].*'
Wabcde #Pas Ok
Wabcdef #Pas Ok
Je crois qu'il voulait le résultat inverse, c'est à dire les autres lignes
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
#6 Le 01/10/2010, à 09:17
- Totor
Re : Problèmes regexps
@survietamine :
un nouveau venu
http://partmaps.org/era/unix/award.html
sinon, si c'est bon, c'est bien la regex mais il faut inverser le résultat (grep -v)
Dernière modification par Totor (Le 01/10/2010, à 09:18)
-- Lucid Lynx --
Hors ligne
#7 Le 01/10/2010, à 09:28
- survietamine
Re : Problèmes regexps
arf, j'avoue, en plus, souvent je le reproche aux collègues !
C'est parce que pour mes tests j'avais utilisé :
echo -e "Wabcdz\nWabcd\nWabded\nWabcde" | grep -E '[!a][!b][!c][!d][!e]'
mais ce n'est pas une excuse valable
Pour en revenir à la demande, je crois que la réponse est que ce n'est pas possible.
Votre regexp match les lignes 'pas ok' alors qu'il veut l'inverse.
Oui, avec grep/sed/awk et autres on peut inverser/supprimer les lignes qui correspondent.
Mais si j'ai compris, il n'en veut pas.
J'en ai déduis cela d'après sa phrase :
je recherche une regexp, pas une ligne de commande !
Dernière modification par survietamine (Le 01/10/2010, à 09:30)
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
#8 Le 01/10/2010, à 09:51
- Totor
Re : Problèmes regexps
arg, j'avais pas vu cette précision ! bien vu !
donc effectivement, y'a pas moyen
-- Lucid Lynx --
Hors ligne
#9 Le 01/10/2010, à 10:28
- Postmortem
Re : Problèmes regexps
J'avais bien compris qu'il voulait récupérer tout ce qui n'était pas abcde, c'est pour ça que j'ai mis mon exemple sed pour récupérer ce qu'il y avait autour de abcde.
Avec grep, je me doutais bien que ça ne fonctionnait pas et d'ailleurs, faut remplacer les ! par ^ car ce n'était pas normal que ça ne sorte que 2 lignes (du moins, c'est pas ce que j'attendais !).
Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde :
$ cat test.txt
Wabcdz #Ok
Wabcd #Ok
Wabded #Ok
Wabcd e #Ok
Wabcde #Pas Ok
Wabcdef #Pas Ok
abcde
$ grep -E '.*[^a][^b][^c][^d][^e].*' test.txt
Wabcdz #Ok
Wabcd #Ok
Wabded #Ok
Wabcd e #Ok
Wabcde #Pas Ok
Wabcdef #Pas Ok
En fait, faudrait le contexte quoi ! Du moins si c'est possible qu'une telle regexp existe !
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#10 Le 01/10/2010, à 10:36
- Totor
Re : Problèmes regexps
oh là là ... je n'y suis pas ce matin
-- Lucid Lynx --
Hors ligne
#11 Le 01/10/2010, à 10:55
- survietamine
Re : Problèmes regexps
J'avais bien compris qu'il voulait récupérer tout ce qui n'était pas abcde, c'est pour ça que j'ai mis mon exemple sed pour récupérer ce qu'il y avait autour de abcde.
Avec grep, je me doutais bien que ça ne fonctionnait pas et d'ailleurs, faut remplacer les ! par ^ car ce n'était pas normal que ça ne sorte que 2 lignes (du moins, c'est pas ce que j'attendais !).
Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde :
Oui, j'avais essayé aussi avec ^.
Ce que je n'ai pas encore compris, c'est pourquoi, j'ai une ligne qui passe à la trappe :
$ echo -e "Wabcdz\nWabcd\nWabded\nWabcde" | grep -E '.*[^a][^b][^c][^d][^e].*'
Wabcdz
Wabcd
Wabcde
Dernière modification par survietamine (Le 01/10/2010, à 10:56)
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
#12 Le 01/10/2010, à 11:19
- Postmortem
Re : Problèmes regexps
En fait, j'ai dit une connerie là :
Mais de toute manière, grep -E '.*[^a][^b][^c][^d][^e].*' test.txt nous sortira forcément toutes les lignes sauf si celle-ci est exclusivement composée de abcde
grep -E '.*[^a][^b][^c][^d][^e].*' test.txt, ça matche toutes les lignes sauf celles qui sont composées de 5 caractères ET (qui ont un a en 1ère position ou un b en 2ème ou un c en 3ème ou un d en 4ème ou un e en 5ème) :
echo -e "Wabcdz\nWabcd\nWabded\nWabcde\nabcdef\nWcdee\na2345\n1b345\n1b3456" | grep -E '[^a][^b][^c][^d][^e]'
Wabcdz
Wabcd
Wabcde
abcdef
1b3456
En clair, je me demande bien si on a aidé ehmicky dans l'histoire !
Dernière modification par Postmortem (Le 01/10/2010, à 11:21)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#13 Le 01/10/2010, à 11:23
- survietamine
Re : Problèmes regexps
En clair, je me demande bien si on a aidé ehmicky dans l'histoire !
T'as raison, il me semble m'être déjà posé la même question que lui à plusieurs reprises.
Et donc, j'avais un peu parcouru le web.
Je ne me souviens pas avoir trouvé une solution adéquate en regexp pure.
Il me semble que les regexp, c'est mieux pour correspondre (match).
C'est peut-être pour ça qu'il y a '-v' dans grep ou équivalent dans d'autres outils.
Je ne sais pas dans quel langage il développe (perl, php, python etc...) mais je pense qu'il peut faire l'équivalent.
Dernière modification par survietamine (Le 01/10/2010, à 11:24)
Ðɸ Ƴơц ℕεєđ Şø₥€ √іêŤąɱίɳƸʂ ?
Hors ligne
#14 Le 01/10/2010, à 11:31
- Postmortem
Re : Problèmes regexps
Puis zut, d'habitude Totor nous sauve !!
Peut-être qu'après le week-end, il retrouvera ses capacités !!!!
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#15 Le 01/10/2010, à 16:32
- ehmicky
Re : Problèmes regexps
Ouh là là que de réponses, je vais regarder tout ça !
Pour la réponse avec une suite de [^ ], il y a un problème je crois, mais je regarde !
Edit : Ok, donc je viens de regarder. Le problème avec la suite de [^ ], c'est que faut que par exemple pour :
.*[^a][^b][^c][^d][^e].*
Chaque [^ ] doit "matcher" une lettre (ce n'est pas facultatif), donc du coup une ligne avec moins de 5 caractères ne peut pas correspondre à cette regexp.
Par ailleurs, '.*' permet tout caractère. Donc par exemple une ligne telle que "ooooooabcdeoooooo" ne serait pas filtrée par cette regexp, parceque "ooooooabcdeo" corresponderait à ".*" et les derniers "ooooo" à "[^a][^b][^c][^d][^e]"
Récapitulatif : oui cela n'a pas l'air de marcher.
Pour la question des points d'exclamation, ils ne marchent que pour le globbing. Dans une regexp, cela signifiait simplement un '!' littéral, c'est pour ça que ça marchait pas.
Edit2 : Je vois vraiment pas de solution, je pense que Totor a raison en disant qu'il n'y en a pas, et qu'on est obligé d'utiliser une commande inversant la sélection.
J'ai cherché au-delà des regexps avec le globbing étendu mais ça aide pas plus. Je connais pas Perl, mais je crois que les regexps sont plus évoluées, donc je sais pas si ça se résolverait ainsi... (si quelqu'un connaît Perl)
Dernière modification par ehmicky (Le 01/10/2010, à 17:15)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#16 Le 01/10/2010, à 17:14
- Postmortem
Re : Problèmes regexps
Si c'est pour virer toutes les lignes contenant abcde alors :
sed -n '/abcde/!p' <<< $'abcdedfgqsgd\naokhfez\nabcdye\naeabcdesddf\nbd'
Si non, moi pas voir ce que toi veut faire !!
Dernière modification par Postmortem (Le 01/10/2010, à 17:14)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#17 Le 01/10/2010, à 17:17
- ehmicky
Re : Problèmes regexps
sed '/abcde/ d' <<< $'abcdedfgqsgd\naokhfez\nabcdye\naeabcdesddf\nbd'
aussi.
En fait, c'est pas dans un but précis, c'est juste une question générale sur les regexps, parce que je suis à chaque fois confronté à cette question.
La question initiale est : une regexp (et non une commande utilisant les regexps comme grep, sed, awk, etc.) symbolisant toute suite de caractères, à condition que celle-ci ne comprenne pas une séquence précise de caractères.
Mais je crois que y'a pas de solution en fait. Dans la pratique, ça signifie être obligé d'utiliser les méthodes d'inversions des commandes grep -v, sed 'd', etc.
Dernière modification par ehmicky (Le 01/10/2010, à 17:21)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#18 Le 01/10/2010, à 18:49
- sputnick
Re : Problèmes regexps
Il faut voir les look ahead et les look behind dans pcre et perl.
Exemple :
sputnick@FreAkyLab:~$ pcregrep '(?<!text)foo' <<< textfoo
sputnick@FreAkyLab:~|ERROR:1|$ pcregrep '(?<!text)foo' <<< basefoo
basefoo
sputnick@FreAkyLab:~$
edit: CF => http://www.regular-expressions.info/lookaround.html
Dernière modification par sputnick (Le 01/10/2010, à 18:51)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
#19 Le 06/10/2010, à 23:46
- sputnick
Re : Problèmes regexps
Ca marche aussi avec grep -P si cette option est supporté (semble le défaut sous Lucid)
Qui veut faire quelque chose trouve un moyen, qui ne veut rien faire trouve une excuse. Proverbe arabe
https://sputnick.fr
Hors ligne
Pages : 1