Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/04/2012, à 12:21

credenhill

question regex [résolu]

hello
je cherche comment extraire la première suite de majuscules d'une chaine avec grep -o.
Avec sed, awk, ou grep + pipe pas de problème, mais avec grep -o ?

$ echo ">AAAAAxxxxxxxBBBBxxxxCCCCCCC" | grep  -Eo '[A-Z]+'
AAAAA
BBBB
CCCCCCC
$ 

je ne veux que AAAAA. Les xxx sont n'împorte quels caractères, sauf des majuscules.
merci

Dernière modification par credenhill (Le 05/04/2012, à 14:44)

Hors ligne

#2 Le 05/04/2012, à 12:59

pingouinux

Re : question regex [résolu]

Bonjour credenhill,
Que du grep, mais il y a un pipe

$ echo ">AAAAAxxxxxxxBBBBxxxxCCCCCCC" | grep  -Eo '^[^A-Z]*[A-Z]+' | grep -Eo '[A-Z]+'
AAAAA

Hors ligne

#3 Le 05/04/2012, à 13:11

sputnick

Re : question regex [résolu]

Un seul grep wink

echo ">AAAAAxxxxxxxBBBBxxxxCCCCCCC" | grep -oP "[A-Z]{5}(?=[a-z]+)"

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#4 Le 05/04/2012, à 13:22

pingouinux

Re : question regex [résolu]

Bonjour sputnick,
C'était bien vu, mais ça ne marche pas dans tous les cas :

$ echo ">AAAAxxxxxxxBBBBxxxxCCCCCCC" | grep -oP "[A-Z]{5}(?=[a-z]+)"

$ echo ">AAAAAxxxxxxxBBBBBxxxxCCCCCCC" | grep -oP "[A-Z]{5}(?=[a-z]+)"
AAAAA
BBBBB

Hors ligne

#5 Le 05/04/2012, à 13:38

sputnick

Re : question regex [résolu]

Le "{5}" est pas là pour décorer pingouinux. Il faut connaître le nombre de caractères de la chaîne recherchée.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#6 Le 05/04/2012, à 13:48

pingouinux

Re : question regex [résolu]

@sputnick #5 : Il me semblait que credenhill voulait un grep qui marche dans tous les cas. De plus, avec le {5} écrit "en dur", on récupère toutes les séquences de 5 majuscules suivies de minuscules (voir #4).

Hors ligne

#7 Le 05/04/2012, à 14:03

credenhill

Re : question regex [résolu]

merci
effectivement, le nombre de majuscules est variable, donc {n} ne fonctionne pas

Hors ligne

#8 Le 05/04/2012, à 14:22

sputnick

Re : question regex [résolu]

Ok, donc :

echo ">AAAAAxxxxxxxBBBBBxxxxCCCCCCC" | grep -oP '^[^A-Z]+\K[A-Z]+'

(Avec l'aide de spewn sur irc freenode # regex.)

perldoc perlre a écrit :

\K        [6]  Keep the stuff left of the \K, don't include it in $&

Dernière modification par sputnick (Le 05/04/2012, à 14:31)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 05/04/2012, à 14:44

credenhill

Re : question regex [résolu]

effectivement, merci

Hors ligne

#10 Le 05/04/2012, à 14:51

pingouinux

Re : question regex [résolu]

Bravo !

Hors ligne

#11 Le 05/04/2012, à 16:51

credenhill

Re : question regex [résolu]

en tentant de comprendre le \K, je crois qu'on peut utiliser ces équivalents du \K:

$ echo ">AAAAAxxxxxxxBBBBBxxxxCCCCCCC" | grep -oP '(?<=>)[A-Z]+(?=[^A-Z]+)'
AAAAA
$ 

on ignore le > qui précède avec (?<=>)
on garde les majuscules avec [A-Z]+
et on ignore le reste des non-majuscules avec (?=[^A-Z]+)

Hors ligne

#12 Le 05/04/2012, à 17:50

pingouinux

Re : question regex [résolu]

Il y a une différence entre les deux méthodes proposées; avec la méthode de credenhill #11, il faut connaître le caractère qui précède la 1ère séquence de majuscules, ce qui n'est pas nécessaire avec celle de sputnick #8.

Hors ligne

#13 Le 06/04/2012, à 08:52

credenhill

Re : question regex [résolu]

pas forcemment

$ echo ">AAAAAxxxxxxxBBBBBxxxxCCCCCCC" | grep -oP '(?<=^.)[A-Z]+(?=[^A-Z]+)'
AAAAA

Hors ligne

#14 Le 06/04/2012, à 14:16

sputnick

Re : question regex [résolu]

(?<=^.)
(?=[^A-Z]+)

Pour info pour ceux qui lisent ces lignes, cette technique de regex avancé s’appelle look-ahead et look-behind.
C'est très puissant.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne