#1 Le 25/11/2016, à 10: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, à 10:11)
Hors ligne
#2 Le 25/11/2016, à 10: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, à 10:54)
Hors ligne
#3 Le 25/11/2016, à 12: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, à 16: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
Donut.
Hors ligne
#5 Le 25/11/2016, à 21: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 25/11/2016, à 23: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