Pages : 1
#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
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.)
\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