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 25/11/2016, à 11:38

DonutMan75

[RESOLU] [REGEXP] Ca y est, je me lance !

Bonjour à tous,
voilà, j'essaie de développer mes propres regexp comme un grand mais il y a une chose qui ne fonctionne pas....

Dans une ligne de nombres séparés par des espaces, j'aimerais que la regexp retourne les lignes qui contiennent plusieurs fois le même nombre.

Ainsi : '101 123 45 78 10 123 14 456 12' retournerait 'vrai' car 123 est présent deux fois
Mais ' 101 123 45 78 10 14 456 12' ne retournerait rien du tout.

Voici ma REGEXP (qui ne fonctionne pas....)

$ echo '123 45 78 10 123 14 456 12' | grep -E '(\<[0-9]+\>)*\1'

Auriez-vous des idées ?

Merci d'avance,

Donut

Dernière modification par DonutMan75 (Le 26/11/2016, à 11:11)

Hors ligne

#2 Le 25/11/2016, à 11:54

DonutMan75

Re : [RESOLU] [REGEXP] Ca y est, je me lance !

Ah j'ai trouvé, dans une REGEXP le '*' signifie "un nombre quelconque (possiblement 0) de fois le caractère précédent"...
Ce qui est complètement différent du '*' des pattern du shell qui signifie "n'importe quoi de n'importe quelle longueur".
Je ne sais pas s'il existe l'équivalent du '*' du shell ?

J'ai trouvé une solution qui semble fonctionner, mais qui n'est peut-être pas très propre ni minimal :

$ echo '123 45 78 10 123 14 456 12' | grep -E '(\<[0-9]+\>)[a-zA-Z0-9 ]*\1'
123 45 78 10 123 14 456 123 14 456 12

Auriez-vous procédé de cette façon ?

Merci d'avance,

Donut

Dernière modification par DonutMan75 (Le 25/11/2016, à 11:54)

Hors ligne

#3 Le 25/11/2016, à 13:16

LeoMajor

Re : [RESOLU] [REGEXP] Ca y est, je me lance !

bonjour,
et si il y a plusieurs nombres qui se répètent ...

aaa="123 45 78 10 123 14 456 12 15 78 1 ab 78 3 900 klm ab"

awk '{for(i=1;i<=NF;i++){if($i~/[0-9]+/)nbs[$i]++}; print $0 }; END {for(n in nbs){if(nbs[n]>1)printf ("%s %s fois\n",n,nbs[n])} }' <<< "$aaa"
123 45 78 10 123 14 456 12 15 78 1 ab 78 3 900 klm ab
78 3 fois
123 2 fois

Hors ligne

#4 Le 25/11/2016, à 17:25

DonutMan75

Re : [RESOLU] [REGEXP] Ca y est, je me lance !

Bonsoir LeoMajor,
merci pour ta réponse,
en effet avec cette commande on matche toutes les répétitions.
Bon, awk c'est la prochaine étape pour moi ^^

Bonne soirée à tous smile

Donut.

Hors ligne

#5 Le 25/11/2016, à 22:59

gigiair

Re : [RESOLU] [REGEXP] Ca y est, je me lance !

La réponse avec awk ne me paraît pas être exactement celle qui correspond à la question.
Je propose

 grep -E '(\<[1-9]?[0-9]*\>)[^0-9].*\<\1\>'

--
JJR.

Hors ligne

#6 Le 26/11/2016, à 00:25

DonutMan75

Re : [RESOLU] [REGEXP] Ca y est, je me lance !

Bonsoir gigiair (tolkien ?),
merci pour cette proposition.
Si je décortique correctement l'équivalent du shell pattern "*" s'écrit en regexp ".*" qui signifie : "n'importe quel caractère" répété un nombre quelconque de fois (dont 0) ?

Merci et bonne soirée

D.

Hors ligne