[Shell] Supprimer les répétitions de caractère

Supprimer les répétitions de caractère [Shell] - Shell/Batch - Programmation

Marsh Posté le 04-06-2009 à 11:08:55    

Bonjour,
 
Je fais actuellement du provisionning de masse de mots de passes, et pour cela j'ai besoin d'en générer à la pelle.
 
J'utilise l'outil pwgen qui fonctionne bien, mais qui parfois répète 3 ou 4 fois le même caractère.
 
Exemples :
eer4ieL?
oor]eeCo
 
Comme certains serveurs sont configurés pour n'accepter le même caractère que 2 fois, j'aimerai pouvoir remplacer les n caractère en trop, par une génération d'un nouveau caractère (`pwgen 1 1`)
 
Avez-vous une idée d'une regexp en sed ou autre, qui permettrai de remplacer un caractère a partir de sa troisième apparition ?

Reply

Marsh Posté le 04-06-2009 à 11:08:55   

Reply

Marsh Posté le 04-06-2009 à 14:15:34    

tiens je me suis amusé avec ton problème:
 

Code :
  1. awk "{ multicar=0; for (x in t) { t[x]=0 } for(i = 1; i < length($0); i++) { t[substr($0,i,1)]++; if (t[substr($0,i,1)]> 2) { multicar++ } } if (multicar == 0) {    print $0\" OK\" } else {print $0\"  KO !!\"}} " __fichier rempli password__


 
il faut qu'il n'y ait qu'un password par ligne...
 
 
en version détaillée :
 

Code :
  1. awk "
  2. {
  3.   multicar=0;
  4.   for (x in t) {
  5.     t[x]=0
  6.   }
  7.   for(i = 1; i < length($0); i++) {
  8.     t[substr($0,i,1)]++;
  9.     if (t[substr($0,i,1)]> 2) {
  10.       multicar++
  11.     }
  12.   }
  13.   if (multicar == 0) {
  14.     print $0\" OK\"
  15.   } else {
  16.     print $0\"  KO !!\"
  17.   }
  18. } " __fichier rempli password__


Message édité par pataluc le 04-06-2009 à 14:28:02
Reply

Marsh Posté le 04-06-2009 à 14:28:47    

après je suis parti du principe qu'il était plus simple de ne juste pas afficher le password et d'en générer un autre plutot que de chercher à le corriger...

Reply

Marsh Posté le 04-06-2009 à 17:45:46    

C'est beau, en une ligne !
 
J'ai donc au final :

Code :
  1. pwgen -1ycn 8 150 | sed "s/;/`pwgen 1 1`/g" | awk "{ multicar=0; for (x in t) { t[x]=0 } for(i = 1; i < length($0); i++) { t[substr($0,i,1)]++; if (t[substr($0,i,1)]> 2) { multicar++ } } if (multicar == 0) { print \$0 }} "


(j'élimine aussi les ";" pour mon fichier csv).
 
Par contre ça fonctionne pas j'ai quand même un "Vook=oo2" dans la liste :(
 
Merci beaucoup pour ton aide


Message édité par bichtoubard le 04-06-2009 à 17:49:03
Reply

Marsh Posté le 05-06-2009 à 10:30:03    

ca marche moi avec ce pwd... mais je suis sur un windows avec un portage des commandes unix, ya peut etre donc qques écarts de comportement...
 
sinon, pourquoi tu as mis un \ dans le dernier print?
 
pour débugguer le truc, tu peux passer la commande:

Code :
  1. echo Vook=oo2 | awk "{ multicar=0; for (x in t) { t[x]=0 } for(i = 1; i < length($0); i++) { t[substr($0,i,1)]++; if (t[substr($0,i,1)]> 2) { multicar++ } } if (multicar == 0) { print \$0 } for (x in t) {print x\" \"t[x]}} "


pour voir le contenu du tableau à la fin...

Reply

Marsh Posté le 05-06-2009 à 13:14:30    

Oui je vais essayer de debugger cela, en fait je pense que c'est justement un problème entre les \$0 et les $0, pour moi si je laisse $0 il m'affiche juste "0" alors que si je passe \$0 il affiche bien le contenu voulu.
 
A mon avis il faut que je remplace les $0 par des \$0 partout.
 
Je teste tout ça et je te tiens au courant

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed