Forum Programmation.shell Récuperer noms d'un fichier pour l'envoyer dans une chaine de caractère dans un fichier

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
22
oct.
2013

Bonjour,

Je souhaiterais avoir de l'aide sur l'édition d'un script ??

Dès que l'on branche un lecteur de CV sur Mac, il génère un fichier cu.usbmodem XXX, sachant que XXX est le numéro du Port.

Je souhaiterais donc savoir comment récupérer les 3 numéros du port situé à la fin du fichier, et les envoyer dans une chaine de caractère >> >> >> ( COM1=cu.usbmodem XXX ) située dans un fichier "**.ini" ?

Je voudrais savoir si quelqu'un peut m'aider ou m'indiquer comment faire pour écrire ce script qui permettrait de faire cet manipulation…. cela m'aiderais beaucoup dans mon travail…

Je pense qu'il faut utiliser la commande "grep | Sed" mais je ne connais pas la syntaxe exacte..

Merci d'avance..
Cordialement,
Julien.

  • # Je n'ai peut-être pas compris la question

    Posté par  (site web personnel) . Évalué à 0. Dernière modification le 22 octobre 2013 à 17:01.

    je ne sais pas ce qu'est un lecteur de CV ni où est générer le fichier
    mais la commande devrais ressembler à

    ls -l cu.usbmodem* | cut --delimiter=' ' -s -f 2 >> monfichier
    
    • [^] # Re: Je n'ai peut-être pas compris la question

      Posté par  . Évalué à 1. Dernière modification le 22 octobre 2013 à 18:02.

      CV : Lecteur de Carte Vitale

      Je récupère le N° du lecteur "xxx" dans la variable REP en demandant de le taper au clavier…
      donc $REP="xxx" >> Numéro du lecteur récuperer : OK

      Après il faut que je remplace la ligne "COM1=/dev/cu.usbmodem" par "COM1=/dev/cu.usbmodemXXX" donc par COM1=/dev/cu.usbmodem'$REP' dans le fichier "io_comm.ini"

      j'ai un script qui ressemble a cà :

      read REP
      ls /dev | grep io_comm.ini |       # trouver fichier io_comm.ini
      xargs sed -e -i 's/^COM1/(COM1=/dev/cu.usbmodem'"$REP"')'  # remplacer ligne commencant par "COM1" par "COM1=/dev/cu.usbmodem411" quand $REP=411

      Merci de m'éclairer sur ce script,
      Bonne fin de journée,
      Cordialement,
      Julien

      • [^] # Re: Je n'ai peut-être pas compris la question

        Posté par  . Évalué à 3.

        en etant dans le dossier qui contient de fichier io_comm.ini
        et en utilisant le # comme separateur dans le sed pour simplifier la gestion des / dans le chemin

        read REP
        echo "vous avez saisi : $REP"
        sed -i -e 's#^COM1=/dev/cu.usbmodem#COM1=/dev/cu.usbmodem'$REP'#g' io_comm.ini

        ca doit pouvoir se simplifier en faisant reentrer le motif trouvé à gauche du sed dans le motif de remplacement.

        • [^] # Re: Je n'ai peut-être pas compris la question

          Posté par  . Évalué à 0.

          Bonjour,

          Merci pour l'aide NeoX..
          J'ai essayé et ca ne fonctionne pas.. pas de message d'erreur, mais pas de "411" dans
          la chaine de caractère COM1=/dev/cu.usbmodem"xxx"… pourtant je suis bien dans le répertoire ou se trouve le fichier "io_comm.ini"…

          Je suis ouvert a toutes réponses, et merci d'avance…

          • [^] # Re: Je n'ai peut-être pas compris la question

            Posté par  . Évalué à 3.

            attention, ne connaissant pas ton fichier io_comm.ini
            j'ai fait un modele de script supposant que le fichier contenait la ligne

            COM1=/dev/cu.usbmodem

            là ou dans ton exemple tu ne cherches que

            COM1

            la difference vient peut-etre de là

            • [^] # Re: Je n'ai peut-être pas compris la question

              Posté par  . Évalué à -1.

              Effectivement le fichier Io_comm.ini contient bien la ligne

              "COM1=/dev/cu.usbmodem"

              Mais le problème c'et que la variable ne va pas se mettre après "cu.usbmodem"

              Merci…

            • [^] # Re: Je n'ai peut-être pas compris la question

              Posté par  . Évalué à 1.

              Re-Bonjour…

              Par contre ca fonctionne mais si je lance la commande 2 fois; il me l'inscrit 2 fois ( ce qui est normal.. )
              donc petite question : Comment faire pour qu'il ne l'indique qu'une seul fois, et le cas ou la commande est lancée une deuxième, qu'il indique que le fichier est déja configurer et surtout qu'il ne rajoute pas le 2 ème "411" dèrrière COM1=cu.usbmodem411 ?

              merci d'avance pour l'aide…
              Bonne aprèm…

              • [^] # Re: Je n'ai peut-être pas compris la question

                Posté par  . Évalué à 4.

                tester si le fichier contient deja cu.usbmodem411 et quitter avant de faire la modif par exemple.

                grep 'usbmodem'$REP io_comm.ini && exit
                sed -i -e '.......'
                • [^] # Re: Je n'ai peut-être pas compris la question

                  Posté par  . Évalué à 1.

                  Bonjour,

                  Merci pour ta réponse… j'ai pensé à autre chose .. :

                  Serait-il possible à chaque fois de supprimer le fichier Io_comm.ini et de la remplacer par celui qu'on créer quand on lui intègre la variable.. ?

                  REP="411"

                  Créer Fichier "Io_comm.ini" contenant juste la ligne COM1=/dev/cu.usbmodem"411".
                  et si on relance la commande qu'il remplace ancien fichier "io_comm.ini" par nouveau.

                  Est il possible de créer une ligne de commande pour faire cela ?

                  Merci d'avance NeoX.. tu m'aide beaucoup…

                  • [^] # Re: Je n'ai peut-être pas compris la question

                    Posté par  . Évalué à 3.

                    actuellement on remplace la ligne COM1=/dev/cu.usbmodem par COM1=/dev/cu.usbmodemXXX
                    comme l'enoncé en le precise pas, je pensais que le fichier io_comm.ini contenait d'autres lignes.

                    si tu veux remplacer/ecraser le fichier io_comm.ini, il suffit alors de remplacer nos grep/exit/sed par

                    read REP
                    echo 'COM1=/dev/cu.usbmodem'$REP >io_comm.ini
                    • [^] # Re: Je n'ai peut-être pas compris la question

                      Posté par  . Évalué à 0.

                      D'accord j'ai pigé… merci pour l'info et effectivement ca fonctionne !!!

                      Ok pour ce pblm.. par contre pour faire plus simple :

                      est-il possible de récupérer le valeur de la variable REP directement à partir du fichier d'origine

                      pour l'instant ca ressemble à ca :

                      find /dev -name "cu.usbmodem*" -print      # Noms du fichier contenant le N° de Port ( soit 3 chiffres ou soit 2 lettres et 2 chiffres )
                      
                      echo "taper le numero de port dèrrière USBMODEM :" 
                      read REP
                      echo "vous avez saisi : $REP"
                      echo 'COM1=/dev/cu.usbmodem'$REP >io_comm.ini
                      

                      Est-il possible de récuperer la Variable REP directement à partir de la réponse du Find afin d'éviter de la taper manuellement ???

                      Merci d'avance…

                      • [^] # Re: Je n'ai peut-être pas compris la question

                        Posté par  . Évalué à 0.

                        REP=$(find /dev -name "cu.usbmodem*" -print)
                        echo "COM1=${REP}" > io_comm.ini
                        

                        Bon, ça gère pas le cas où le modem n'est pas déclaré dans /dev
                        auquel cas io_comm.ini ne contient que COM1=

                      • [^] # Re: Je n'ai peut-être pas compris la question

                        Posté par  (Mastodon) . Évalué à 2. Dernière modification le 23 octobre 2013 à 22:37.

                        Salut,

                        Si tu n'as qu'un objet cu.usbmodem dans ton /dev, pas de problême, la boucle ne tournera qu'une fois. Si il y en a plusieurs, ru devras demander à ton utilisateur de choisir…

                        Voici un exemple de code pour extraire le numéro (pas testé, y a peut être à vérifier le sed).

                        debug=1
                        MODEMS=$(ls /dev/cu.usbmodem*); # Tu peux utiliser ton "find" à la place
                        [ "$debug" = "1" ] & echo "\$MODEMS=$MODEMS";
                        for modem in $MODEMS; do
                            [ "$debug" = "1" ] && echo "\$modem=$modem";
                            short_modem=$(basename $modem); # Sépare le chemin donné par le 'ls' et récupére le noms du fichier
                            [ "$debug" = "1" ] && echo "\$short_modem=$short_modem";
                            modem_id=$(echo $short_modem | sed -n -e 's#cu.usbmodem(.*)#\1#g'
                            [ "$debug" = "1" ] && echo "\$modem_id=$modem_id";
                        loop

                        N'oublie pas de repasser le param 'debug' à 0 avant de passer en prod !
                        Bon code !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.