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 28/05/2013, à 16:12

fouadd

Probleme avec la commande sed

Bonjour tout le monde

svp j'ai besoin d'un petit coup de main pour l'utilisation de la commande sed

je vais vous expliquer un peu la situation : j'ai un fichier texte qui comporte plusieurs lignes, et mon programme doit afficher a chaque fois une ligne de ce document d'une manière aléatoires.. jusqu'ici j'ai fais ce travail , j'ai utiliser random pour choisir un numéro aléatoire et j'ai utiliser cat et cut et sed pour afficher la ligne choisie aléatoirement et pour afficher juste un des champs de la ligne .. le problème c'est qu'il ne faut pas que le choix de la ligne soit répéter une deuxième fois .. C a dire si par exemple le programme m'affiche la ligne 3 ( sachant que 3 est choisit  aléatoirement ), et on refait la même chose, alors 3 ne doit pas être choisit une deuxième fois
Alors j'ai essayer de supprimer a chaque fois la ligne choisie avec la commande SED :

 sed -i $((mon_variable))d monfichier.txt 

Jusqu'ici tout va bien big_smile Mais si le numéro aléatoire est par exemple 2 pour la première fois , alors le programme va supprimer la ligne 2 , mais dans la deuxième fois que le numéro aléatoire est de 2 , alors il m'affiche une ligne vide sad Comme si j'ai rien changer , au lieu que qu'on affiche a l'écran la ligne une deuxième fois , on affiche une ligne vide ;;
Si vous avez une solution, aidez moi svp ! Soit en résolvant ce problème ou me donner une méthode comment choisir un nombre aléatoire unique , c'est a dire sans que le programme ne choisit le même numéro.
merci

Hors ligne

#2 Le 30/05/2013, à 10:49

NuX_o

Re : Probleme avec la commande sed

Salut,

et si tu faisais un

sed '/($variable)/ d' fichier.txt

là où il y a le variable je n affiche pas la ligne ?

après je ne suis pas sûr de la syntaxe pour afficher correctement la variable...

Hors ligne

#3 Le 30/05/2013, à 13:06

fouadd

Re : Probleme avec la commande sed

merci Nux_O mais sa marche pas ;;
en fait j'ai changé de méthode dans mon programme , je n'ai pas utiliser SED mais j'ai fais autre choses ;
mais bon juste pour approfondir nos connaissances, j'ai cherché partout mais j'ai pas trouvé la solution de ce problème
je ne pense pas que c'est faisable
car quand j'applique sed pr supprimer la ligne; la ligne normalement est supprimé mais je pense que son adresse n'est pas supprimé, c'est peut etre quelque chose qui a relation avec les files et piles boff merci

Hors ligne

#4 Le 30/05/2013, à 13:17

NuX_o

Re : Probleme avec la commande sed

Effectivement, la variable est constamment changé avec la derniere ligne affichée:

ligne 1 affiché mis en variable
ligne 2 affiché écrase la variable ligne 1
ligne 1 se réaffiche et réécrase ligne 2

c'était ça le problème ?

sinon, ça m'intéresserait bien de connaître la solution que tu as trouvé smile

De plus quand sed "supprime" (en réalité il ne supprime pas, il ne fait que PAS AFFICHER) l'adresse mémoire de la ligne est toujours présente... c'est pour ça qu'elle revenait constamment , sed ne modifie en aucun cas une ligne ou un fichier (si quelqu'un peu affirmer, infirmer ou au contraire donner une autre explications, je crois que nous serions preneur smile)
Il faudrait trouver un algorithme ou une méthode qui mettrait en dehors de la pile une ligne qui a déjà été sélectionnée; Du style un "count=0" et +1 dés qu'elle est affichée...

je dis ça mais je ne programme pas encore en shell... justement je commence à apprendre... j'ai surtout fais de l'objets, les méthodes doivent être différentes... (??)

merci de ta réponse wink

Hors ligne

#5 Le 30/05/2013, à 13:28

Hizoka

Re : Probleme avec la commande sed

Il faudrait deplacer ton topic dans le forum des commandes/terminal...

bah perso je passerai par une liste (variable ou fichier)...

min=1
max=20

# Mise a 0 du fichier temporaire
echo "" > /tmp/nb_tmp

# Boucle infinie
while true
do
  # On crée/recrée un nombre aleatoire
  number=$[($RANDOM % ($[$max - $min] + 1)) + $min]

  # Si le nombre n'est pas présent dans le fichier temporaire
  if [[ -z $(egrep "^${number}$" /tmp/nb_tmp) ]]
  then
     # Ajout du nombre au fichier temporaire
    echo "${number}" >> /tmp/nb_tmp

     # .... traitement utilisant le nombre aleatoire
    # Quand c'est bon, on casse la boucle
    # breack
  fi
done 

De plus quand sed "supprime" (en réalité il ne supprime pas, il ne fait que PAS AFFICHER) l'adresse mémoire de la ligne est toujours présente... c'est pour ça qu'elle revenait constamment , sed ne modifie en aucun cas une ligne ou un fichier (si quelqu'un peu affirmer, infirmer ou au contraire donner une autre explications, je crois que nous serions preneur )

Sed peut tres facilement modifier l'affichage ou le fichier directement.
Pour modifier un fichier, il faut simplement utiliser l'option "-i".

Dernière modification par Hizoka (Le 30/05/2013, à 13:46)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 30/05/2013, à 13:43

NuX_o

Re : Probleme avec la commande sed

Excellent, merci Hizoka !

Hors ligne

#7 Le 30/05/2013, à 13:46

Hizoka

Re : Probleme avec la commande sed

Ou on peut utiliser une boucle qui utilisera tous les nombres de facon aleatoire, ainsi pas de verification...

min=1
max=20

# Boucle traitant tous les nombres 1 à 20 de facon aleatoire
for i in $(seq ${min} ${max} | sort -R)
do
 ...
done

Dernière modification par Hizoka (Le 30/05/2013, à 14:07)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 30/05/2013, à 14:07

Hizoka

Re : Probleme avec la commande sed

si c'est reglé alors ajoute un [resolu] au titre de ton topic smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne